c# - 转换 IQueryable 以实现 IAsyncEnumerable

标签 c# unit-testing entity-framework-core moq iasyncenumerable

<分区>

我在一个方法中有一个查询:

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();
}

其中有这个单元测试:

[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"));
}

显然调用 .ToListAsync(); 失败是因为:

The source IQueryable doesn't implement IAsyncEnumerable. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.

扩展方法是来自 Entity Framework Core 的方法。

如何将我的客户列表转换为 IAsyncEnumerable

作为引用,IEntityReader 接口(interface)的定义如下:

public interface IEntityReader<out TEntity> where TEntity : Entity
{
    IQueryable<TEntity> Query();
}

最佳答案

感谢@Nkosi,这是解决方案:

How to mock an async repository with 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();

关于c# - 转换 IQueryable 以实现 IAsyncEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40763337/

相关文章:

c# - 身份服务器 : Login after account activation

c# - Dapper:单元测试 SQL 查询

c# - MySQL-DBUpdateException ('Deadlock found when trying to get lock; try restarting transaction')

c# - 为什么控制台应用程序和 WebAPI 上加载的数据库值不同?

c# - 无法将字符串数组正确转换为 double 组,返回 0

C# - 传递一个可能在其他地方改变的 bool 值,但我不想改变方法

javascript - meteor 测试 : Mocha doesn't find all test files

unit-testing - 单元测试时后门 java 访问的替代方法

c# - 为什么 EF Core 不设置自定义注解?

c# - 如何使用代码隐藏创建 StackPanel -> Border -> Background