jan*_*ann 7 c# unit-testing moq entity-framework-core
我有一个方法的查询:
private readonly IEntityReader<Customer> _reader;
public async Task<IEnumerable<Customer>> HandleAsync(GetCustomer query)
{
var result = _reader.Query()
.Include(customer => customer.Organization)
.Where(customer => customer.Name == query.Name);
return await result.ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)
哪个具有此单元测试:
[Fact]
public async Task HandleGetCustomer_ReturnsCustomer_WhenNameMatches()
{
// Arrange
var customers = new List<Customer>()
{
new Customer
{
Id = new Guid("d4e749ba-6874-40f4-9134-6c9cc1bc95fe"),
Name = "John Doe",
Age = 18,
Organization = new Organization
{
Id = new Guid("b2ba06c9-5c00-4634-b6f7-80167ea8c3f1"),
Name = "TheCompany",
Number = 42
}
},
new Customer
{
Id = new Guid("0679ceb5-3d4f-41f3-a1b0-b167e1ac6d7e"),
Name = "Another Guy",
Age = 39,
Organization = new Organization
{
Id = new Guid("b2ba06c9-5c00-4634-b6f7-80167ea8c3f1"),
Name = "TheCompany",
Number = 42
}
}
}.AsQueryable();
var entityReader = new Mock<IEntityReader<Customer>>(MockBehavior.Strict);
entityReader.Setup(reader => reader.Query()).Returns(customers);
var query = new GetCustomer
{
Name = "John Doe"
};
var handler = new HandleGetCustomer(entityReader.Object);
// Act
var result = await handler.HandleAsync(query);
// Assert
Assert.NotNull(result);
Assert.True(result.Count() == 1);
Assert.True(result.FirstOrDefault().Id == new Guid("d4e749ba-6874-40f4-9134-6c9cc1bc95fe"));
}
Run Code Online (Sandbox Code Playgroud)
由于以下.ToListAsync();原因,对的调用失败:
源IQueryable没有实现IAsyncEnumerable。只有实现IAsyncEnumerable的源才能用于Entity Framework异步操作。
扩展方法是Entity Framework Core中的方法。
如何将客户列表转换为IAsyncEnumerable?
供参考,IEntityReader接口定义如下:
public interface IEntityReader<out TEntity> where TEntity : Entity
{
IQueryable<TEntity> Query();
}
Run Code Online (Sandbox Code Playgroud)
jan*_*ann 13
感谢@Nkosi,这是解决方案:
更改客户列表后,如何使用Entity Framework Core模拟异步存储库的代码段:
var customers = new TestAsyncEnumerable<Customer>(new List<Customer>
{
new Customer
{
Id = new Guid("d4e749ba-6874-40f4-9134-6c9cc1bc95fe"),
Name = "John Doe",
Age = 18,
Organization = new Organization
{
Id = new Guid("b2ba06c9-5c00-4634-b6f7-80167ea8c3f1"),
Name = "TheCompany",
Number = 42
}
},
new Customer
{
Id = new Guid("0679ceb5-3d4f-41f3-a1b0-b167e1ac6d7e"),
Name = "Another Guy",
Age = 39,
Organization = new Organization
{
Id = new Guid("b2ba06c9-5c00-4634-b6f7-80167ea8c3f1"),
Name = "TheCompany",
Number = 42
}
}
}.AsQueryable();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5956 次 |
| 最近记录: |