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