我有 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 实例而不是使用内存数据库来测试不同的功能
您可以通过简单使用 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)