如何moqentity frameworkSaveChangesAsync?

Mock dbContext; [TestFixtureSetUp] public void SetupDbContext() { dbContext = new Mock(); dbContext.Setup(c => c.SaveChanges()).Verifiable(); dbContext.Setup(c => c.SaveChangesAsync()).Verifiable(); dbContext.Setup(c => c.Customers.Add(It.IsAny())) .Returns(It.IsAny()).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())); 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())); 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。

在MasonOgCRM.DataAccess.EF.EntityFrameworkRepository.d__2.MoveNext()在C:\ Users \ Mason \ Desktop \ Repositories \ masonogcrm \ src \ DataAccess.EFRepository \ EntityFrameworkRepository.cs:第43行

我在代码中看不到任何空的内容。 DbContext不为null。 AddCustomers的等效测试与未按预期的异步运行相同。 我怀疑我没有在SetupDBContext()执行正确的SaveChangesAsync设置,但我不知道如何解决它。

你说对了,因为你的一个设置不正确:: dbContext.Setup(c => c.SaveChangesAsync()).Verifiable();

该方法返回一个Task ,你忘了返回一个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());