在我的应用程序中,我通过SQL Server使用EF Core。这一切都很好。当我调用具有例如以下代码的方法时:
public void SomeMethod(int id)
{
var user = _dbContext.Users.SingleOrDefault(x => x.Id == id);
}
然后,这显然找到了一个用户,或者在找不到具有给定null
的用户时返回了id
。
但是,在我的单元测试中,我使用InMemory提供程序。当我从单元测试中调用相同的方法时,它会引发异常,告诉我_dbContext.Users
是null
。
我知道我可以通过在单元测试中向DbContext添加一个空用户列表来轻松解决此问题。但是为什么这在我的“生产”代码中有所不同?
DbSet
永远不会 null
。但这是从InMemory提供程序运行时的情况...
我可以使用全局设置吗?因此,我不必为每个DbSet设置一个空列表来防止这些null
异常,否则这些异常将永远不会发生...
这是我在单元测试中创建DbContext的方式:
我有一家工厂:
public static MyDbContext Create()
{
var options = new DbContextOptionsBuilder<MyDbContext>()
.UseInMemoryDatabase($"{Guid.NewGuid()}")
.Options;
return new MyDbContext(options);
}
在单元测试中,我这样做:
[Fact]
public void MyTest()
{
var context = InMemoryDbContextFactory.Create();
// Example of how I add things to the DbContext (this works)
context.Roles.Add(new UserRole { Id = 1, Name = "Test" });
context.SaveChanges();
var sut = new SutService(context);
var result = sut.MyMethod();
// Do assert...
}
PS。
我知道我的DbContext没有包装在using
语句中。但是即使是这样,我仍然会有同样的问题。