Как 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());