.net 在存储库中模拟 ToListAsync() 不起作用

问题描述 投票:0回答:1

所以我尝试模拟 GetQueryable().ToListAsync() 但我不断收到此错误

“System.NotSupportedException:不支持的表达式...扩展方法(此处:EntityFrameworkQueryableExtensions.ToListAsync)不得在设置/验证表达式中使用。”

模拟代码:

var users = new List<User> { new User() };

var queryableUsers = users.AsQueryable();

_mockRepo.Setup(x => x.GetQueryable<User>()).Returns(queryableUsers);

_mockRepo.Setup(x => x.GetQueryable<User>().ToListAsync(It.IsAny<CancellationToken>())).ReturnsAsync(users);
c# asp.net .net mocking moq
1个回答
0
投票

EntityFrameworkQueryableExtensions.ToListAsync
是一个不能被mock的扩展方法。您可以检查下面的扩展方法的实现,并尝试模拟内部。

public static async Task<List<TSource>> ToListAsync<TSource>(
    this IQueryable<TSource> source,
    CancellationToken cancellationToken = default)
{
    var list = new List<TSource>();
    await foreach (var element in source.AsAsyncEnumerable().WithCancellation(cancellationToken))
    {
        list.Add(element);
    }

    return list;
}

public static IAsyncEnumerable<TSource> AsAsyncEnumerable<TSource>(
    this IQueryable<TSource> source) {
    Check.NotNull(source, nameof(source));

    if (source is IAsyncEnumerable<TSource> asyncEnumerable)
    {
        return asyncEnumerable;
    }

    throw new InvalidOperationException(CoreStrings.IQueryableNotAsync(typeof(TSource))); 
}
© www.soinside.com 2019 - 2024. All rights reserved.