如何最小起订量 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());
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()
.
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());