如何最小起订量 Entity Framework SaveChangesAsync?

How to 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 测试失败,我在调用 await DbContext.SaveChangesAsync().

后一直收到 NullReferenceException

at MasonOgCRM.DataAccess.EF.EntityFrameworkRepository.d__2.MoveNext() in C:\Users\Mason\Desktop\Repositories\masonogcrm\src\DataAccess.EFRepository\EntityFrameworkRepository.cs:line 43

我在我的代码中看不到任何空值。 DbContext 不为空。 AddCustomers 的等效测试除了不按预期运行异步之外是相同的。我怀疑我没有在 SetupDBContext() 中正确设置 SaveChangesAsync,但我不知道如何修复它。

你是对的,问题的发生是因为你的设置不正确:: dbContext.Setup(c => c.SaveChangesAsync()).Verifiable();.

方法 return a Task 而你忘记了 return a Task 因此 null returns.

您可以删除 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());

这对我有用:

dbContext.Verify(m => m.SaveChangesAsync(It.IsAny<CancellationToken>()), Times.Once());