Как moq Entity Framework SaveChangesAsync?
Mock<IDbContext> dbContext;
[TestFixtureSetUp]
public void SetupDbContext()
{
dbContext = new Mock<IDbContext>();
dbContext.Setup(c => c.SaveChanges()).Verifiable();
dbContext.Setup(c => c.SaveChangesAsync()).Verifiable();
dbContext.Setup(c => c.Customers.Add(It.IsAny<Customer>()))
.Returns(It.IsAny<Customer>()).Verifiable();
}
[Test]
public async Task AddCustomerAsync()
{
//Arrange
var repository = new EntityFrameworkRepository(dbContext.Object);
var customer = new Customer() { FirstName = "Larry", LastName = "Hughes" };
//Act
await repository.AddCustomerAsync(customer);
//Assert
dbContext.Verify(c => c.Customers.Add(It.IsAny<Customer>()));
dbContext.Verify(c => c.SaveChangesAsync());
}
[Test]
public void AddCustomer()
{
//Arrange
var repository = new EntityFrameworkRepository(dbContext.Object);
var customer = new Customer() { FirstName = "Larry", LastName = "Hughes" };
//Act
repository.AddCustomer(customer);
//Assert
dbContext.Verify(c => c.Customers.Add(It.IsAny<Customer>()));
dbContext.Verify(c => c.SaveChanges());
}
и вот что я хочу проверить:
public class EntityFrameworkRepository
{
private readonly IDbContext DBContext;
public EntityFrameworkRepository(IDbContext context)
{
DBContext = context;
}
public async Task AddCustomerAsync(Customer customer)
{
DBContext.Customers.Add(customer);
await DBContext.SaveChangesAsync();
}
public void AddCustomer(Customer customer)
{
DBContext.Customers.Add(customer);
DBContext.SaveChanges();
}
}
AddCustomers
тест пройден.
AddCustomersAsync
тест не удается, я продолжаю получать исключение NullReferenceException после вызова await DbContext.SaveChangesAsync()
.
at MasonOgCRM.Доступа к данным.ФВ.EntityFrameworkRepository.д__2.метод MoveNext() в C:UsersMasonDesktopRepositoriesmasonogcrmsrcDataAccess.EFRepositoryEntityFrameworkRepository.cs: линия 43
Я не вижу ничего, что null в моем код. DbContext
не null. Эквивалентный тест AddCustomers
который идентичен, за исключением того, что асинхронный запуск не выполняется должным образом. Я подозреваю, что я не выполнил правильную настройку SaveChangesAsync
на SetupDBContext()
но я не знаю, что делать, чтобы ее исправить.
2 ответов
вы правы проблема возникает из-за одной из ваших настроек неправильно :: dbContext.Setup(c => c.SaveChangesAsync()).Verifiable();
.
метод возвращает a Task
и вы забыли вернуть null
возвращает.
вы можете удалить dbContext.Setup(c => c.SaveChangesAsync()).Verifiable();
или
измените настройку на что-то вроде:
dbContext.Setup(c => c.SaveChangesAsync()).Returns(() => Task.Run(() =>{})).Verifiable();
можно использовать
dataContext.Setup(x => x.SaveChangesAsync()).ReturnsAsync(1);
и
dataContext.Verify(x=>x.SaveChangesAsync());