如何在测试中初始化 IServiceScopeFactory 以使用 Entity Framework 核心 InMemory 数据库

问题描述 投票:0回答:1

我有 HotelRepository 类,其中包含 CRUD 函数,我想使用内存数据库中的 EF core 测试我的所有存储库,但我陷入困境,因为我的存储库类构造函数采用 IServiceScopeFactory

Public class HotelRepository
{
    IScopedServiceFactory factory
    public HotelRepository(IScopedServiceFactory factory)
    {
        this.factory = factory;
    }
    public CreateHotel(HotelInformation)
    {
        var context = Create();
        //code to implement save
        context.savechanges();
    }
    
    private HotelDbContext Create()
    {
        return factory.CreateScope().ServiceProvidor.GetRequiredService<Dbcontext>();
    }
}

//using ms tests
public class HotelDb_Tests
{
    public Test_Save_Hotels()
    {
        var options = new DbCOntextOptionsBuilder<DbContext>().UseInMemoryDatabase("TestHotelDb").Options;
        using (var context = new DbContext(Options))
        {
            //How to create instance of HotelRepository which takes IScopedServiceFactory as parameter 
            //Basically want to do the following
            var HotelRepo = new HotelRepo(ScopedServiceFactory);
            HotelRepo.CreateHotel(HotelInformation)
        }
    }
    
}

如何初始化 HotelRepository 实例而不是使用内存数据库来测试不同的功能

c# .net .net-core mstest
1个回答
0
投票

您可以通过简单使用 ServiceCollection 来实现这一点:

// Create service collection
var serviceCollection = new ServiceCollection();

// Add DI configurations
serviceCollection.AddDbContext<DbContext>(options =>
    {
        options.UseInMemoryDatabase("TestHotelDb");
    });

// Build ServiceProvider
var serviceProvider = serviceCollection.BuildServiceProvider();


// Use it in tests per your example

var serviceScopeFactory = serviceProvider.GetRequiredService<IServiceScopeFactory>();

var HotelRepo = new HotelRepo(serviceScopeFactory);
HotelRepo.CreateHotel(HotelInformation)
© www.soinside.com 2019 - 2024. All rights reserved.