尝试模拟时,源 IQueryable 未实现 IDbAsyncEnumerable

r3p*_*ica 1 c# nunit unit-testing entity-framework moq

我正在尝试测试我拥有的一些代码:

public async Task<Sortation> SaveAsync(Sortation sortation)
{
    if (sortation.Id == 0)
    {
        var sortations = await ListAsync(sortation.CategoryId);
        sortation.Order = sortations.Count;
        _sortationService.Create(sortation);
    }
    else
    {
        _sortationService.Update(sortation);
    }

    await _sortationService.SaveChangesAsync();

    return sortation;
}
Run Code Online (Sandbox Code Playgroud)

ListAsync方法给我带来一个问题。我这样设置我的测试:

[Test]
public async Task ShouldHaveOrderOfZero()
{
    // Assemble
    const string categoryId = "cameras";
    var services = SortationContext.GivenServices();
    var sortationProvider = services.WhenGetSortationProvider();
    var sortations = new List<Sortation>();
    var sortation = new Sortation { CategoryId = categoryId };

    services.MockSortationService.Setup(x => x.List()).Returns(sortations.AsQueryable);

    // Act
    await sortationProvider.SaveAsync(sortation);

    // Assert
    sortation.Order.Should().Be(0);
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到此错误:

消息:System.InvalidOperationException:源 IQueryable 未实现 IDbAsyncEnumerable。只有实现 IDbAsyncEnumerable 的源才能用于实体框架异步操作。

据此:只有实现 IAsyncEnumerable 的源才能用于实体框架异步操作我需要将 EF 添加到我的 UnitTest 项目中,我就是这么做的。但错误仍然存​​在。

ListAsync方法如下所示

public async Task<List<Sortation>> ListAsync(string categoryId, params string[] includes) => 
    await _sortationService.List(includes).Where(m => m.CategoryId.Equals(categoryId)).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎样才能阻止这个错误的发生?

小智 9

就我而言,异常是由于使用错误的 ToListAsync 扩展引起的。

它来自:

使用 System.Data.Entity;代替

使用 Microsoft.EntityFrameworkCore;更改命名空间修复了错误。