在单元测试中使用InMemory时,EF Core DbSet空引用异常

时间:2018-10-07 14:36:35

标签: c# .net-core entity-framework-core

在我的应用程序中,我通过SQL Server使用EF Core。这一切都很好。当我调用具有例如以下代码的方法时:

public void SomeMethod(int id)
{
    var user = _dbContext.Users.SingleOrDefault(x => x.Id == id);
}

然后,这显然找到了一个用户,或者在找不到具有给定null的用户时返回了id

但是,在我的单元测试中,我使用InMemory提供程序。当我从单元测试中调用相同的方法时,它会引发异常,告诉我_dbContext.Usersnull

我知道我可以通过在单元测试中向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语句中。但是即使是这样,我仍然会有同样的问题。

0 个答案:

没有答案