C# 如何在测试中初始化IServiceScopeFactory以使用Entity Framework core InMemory数据库
我有一个HotelRepository类,其中包括crud函数,我想使用内存数据库中的EF core测试我的所有存储库,但我被卡住了,因为我的存储库类构造函数需要IServiceScopeFactoryC# 如何在测试中初始化IServiceScopeFactory以使用Entity Framework core InMemory数据库,c#,.net,.net-core,mstest,C#,.net,.net Core,Mstest,我有一个HotelRepository类,其中包括crud函数,我想使用内存数据库中的EF core测试我的所有存储库,但我被卡住了,因为我的存储库类构造函数需要IServiceScopeFactory Public class HotelRepository { IScopedServiceFactory factory public HotelRepository(IScopedServiceFactory factory) { this.factor
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)
}
}
}
Public class HotelRepository
{
iScopedService工厂
公共酒店存储库(IScopedServiceFactory工厂)
{
这个工厂=工厂;
}
公共酒店(酒店信息)
{
var context=Create();
//实现save的代码
savechanges();
}
私有HotelDbContext创建()
{
返回factory.CreateScope().ServiceProvider.GetRequiredService();
}
}
//使用ms测试
公共类HotelDb_测试
{
公共测试保存酒店()
{
var options=new DbCOntextOptionsBuilder().UseInMemoryDatabase(“TestHotelDb”).options;
使用(var context=newdbcontext(选项))
{
//如何创建以IScopedServiceFactory为参数的HotelRepository实例
//基本上要做到以下几点
var HotelRepo=新HotelRepo(ScopedServiceFactory);
HotelRepo.CreateHotel(HotelInformation)
}
}
}
如何初始化HotelRepository实例,而不是使用inmemory数据库来测试不同的功能您必须提供一个测试实现。有许多像Moq这样的库可以提供帮助:
var mockSs=new Mock();Setup(m=>m.GetRequiredService()).Returns(context)代码>var mockSsf=new Mock();Setup(m=>m.CreateScope()).Returns(mockSs.Object)代码>新建HotelRepo(mockSsf.Object)
。这只是一个例子,我相信asp.net核心特定的帮助程序可用于您的输入。这有助于解决这个问题,我想知道是否可以通过注入数据库上下文工厂函数而不是服务范围工厂来简化事情。数据库工厂功能可以创建范围,从酒店存储库中抽象出这个细节。当然,这可能不适合你的设计,但我认为这是值得考虑的。单元测试最好的一点是,难以测试的代码通常会带来潜在的变化,从而有利于整体设计。因此,您的回购仅依赖于Func
。