所以我尝试模拟 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);
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)));
}