EF Core DbSet исключение нулевой ссылки при использовании InMemory в модульных тестах - PullRequest
0 голосов
/ 07 октября 2018

В моем приложении я использую EF Core с использованием SQL Server.Это все отлично работает.Когда я вызываю метод, который имеет, например, следующий код:

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

Тогда это очевидное свойство возвращает пользователя, когда он его находит, или возвращает null, когда он не находит пользователя сданный id.

Но в своих модульных тестах я использую провайдера InMemory.Когда я вызываю тот же метод из моего модульного теста, он выдает исключение, говорящее мне, что _dbContext.Users равно null.

Я знаю, что могу легко это исправить, добавив пустой список пользователей в DbContextв моих модульных тестах.Но ПОЧЕМУ это отличается в моем «производственном» коде?

A DbSet - это , никогда null.Но это при запуске из ProMider 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.Но даже если бы это было так, у меня все равно была бы та же проблема.

...