C# C单元测试异步错误

C# C单元测试异步错误,c#,entity-framework,linq,unit-testing,asynchronous,C#,Entity Framework,Linq,Unit Testing,Asynchronous,为了解决这个问题,在编写单元测试时,我遇到了以下错误: 错误:源IQueryable未实现 可枚举的 测试调用ToListSync的方法时会出现问题,单元测试如下所示: [TestMethod] public async Task Method1CallsCount() { //arrange MockContainer container = new MockContainer(); IQueryable<Entity1DTO> querableentit

为了解决这个问题,在编写单元测试时,我遇到了以下错误:

错误:源IQueryable未实现 可枚举的

测试调用ToListSync的方法时会出现问题,单元测试如下所示:

[TestMethod]
public async Task Method1CallsCount()
{
    //arrange
    MockContainer container = new MockContainer();

    IQueryable<Entity1DTO> querableentity1DTO = new List<Entity1DTO>().AsQueryable();

    container.DefaultQueryFactory.Setup(p => p.Load(It.IsAny<ContextEnums>(), It.IsAny<Expression<Func<Entity1, Entity1DTO>>>(),
        It.IsAny<Expression<Func<Entity1, bool>>>(), It.IsAny<int>(), It.IsAny<bool>())).Returns(querableentity1DTO);  

    var manager = new Manager1(container.DefaultQueryFactory.Object);

    //act
    var result = await manager.Method1();

    //assert
    //container.repo1.Verify(x => x.repoMethod(It.IsAny<Expression<Func<Entity1,bool>>>()), Times.Once);
}
以下是我正在测试的方法:

public async Task<List<Entity1DTO>> Method1()
{
    Expression<Func<Entity1, Entity1DTO>> select = (x => new Entity1DTO()
    {
             ...   
            });

    Expression<Func<Entity1, bool>> where = (x => x.Property == "Test");

    return await _defaultQueryFactory.Load(ContextEnums.Enum1, select, where).ToListAsync();

}
为了有所帮助,我尝试模拟了在查询工厂中加载数据的方法,但出现了错误,因为DTO模型没有实现IDBSyncEnumerable,现在,正在测试的方法发送一条select语句、一条where语句和一个实体类型,然后查询工厂使用该语句生成一个查询,然后在从load方法返回时使用ToListAsync执行该查询。错误消息显示DTO模型没有实现IDbAsync,而不是DB实体本身

我知道还有一些其他问题是类似的,但我的区别是我使用了DTO模型,并且所讨论的方法不使用上下文本身,因为它被注入load方法,而不是在调用ToListSync的地方


有人有什么想法吗?

发生错误的原因是实体框架异步扩展方法不适用于任何IQueryable-它还应该实现IDbAsyncEnumerable接口。考虑这一点:

var query = new List<EntityDTO>().AsQueryable();
var result = query.ToListAsync().Result;
现在我们可以做:

IQueryable<Entity1DTO> querableentity1DTO = new List<Entity1DTO>().AsAsyncQueryable();

EF异步方法将在其上正确执行。

这里实际上有两个问题,首先,您需要在另一个答案中使用解决方案,并将返回类型更改为TestDbAsyncEnumerator,另一个问题是与Moq有关,安装程序需要调用相同的参数,因此在您的情况下,您必须

return await _defaultQueryFactory.Load(ContextEnums.Enum1, select, where).ToListAsync();


请注意,末尾有两个额外的参数,请尝试将它们保留为null。这应该可以解决问题,只是为了确保也可以尝试将项目添加到返回列表。

是否要对“列表”运行此操作?在这种情况下,信息非常清楚。不能将特定于EF的方法(如ToListSync)与任何可查询项一起使用`Load方法生成一个查询ToListSync执行所述查询DTO模型存在的唯一原因是因为我们将结果选择到一个新模型@PanagiotisKanavost这一切都是在Load方法中完成的,使用它可以使用通用Load方法,唯一需要定义的是类型,select和where语句@PANAGIOTISKANAVOSSISNCE模拟查询工厂始终返回querableentity1DTO-如果该querableentity1DTO现在是TestDbAsyncEnumerable-则不应引发相同的错误,我已经用我答案中的简单代码对其进行了测试;到异步工厂,并让默认查询工厂返回querableentity1DTO,但仍然不起作用也许您应该使用调试器检查_defaultQueryFactory.LoadContextEnums.Enum1,选择,其中返回正确类型TestDbAsyncEnumerable的值。在中调试后,它仍然返回Entity1DTO类型这是否意味着该方法未被模拟对象拦截?它无法返回Entity1DTO类型,因为它不可IQueryable,因此无法对其调用ToListSync。它可以返回类似TestDbAsyncEnumerable或EnumerableQueryah的结果,这是两种答案的组合。既然你设法完全解决了这个错误,那么你就可以得到答案了。
return await _defaultQueryFactory.Load(ContextEnums.Enum1, select, where).ToListAsync();
container.DefaultQueryFactory.Setup(p => p.Load(It.IsAny<ContextEnums>(), It.IsAny<Expression<Func<Entity1, Entity1DTO>>>(),
        It.IsAny<Expression<Func<Entity1, bool>>>(), It.IsAny<int>(), It.IsAny<bool>())).Returns(querableentity1DTO);