感谢@Nkosi为我指向的链接提供了在EF 6中执行相同操作的示例:https ://msdn.microsoft.com/zh-cn/library/dn314429.aspx
。这与EF Core并不完全一样,但是我能够从它开始并进行修改以使其正常工作。下面是我创建的用于“模拟” IAsyncQueryProvider的测试类:
internal class TestAsyncQueryProvider<TEntity> : IAsyncQueryProvider{ private readonly IQueryProvider _inner; internal TestAsyncQueryProvider(IQueryProvider inner) { _inner = inner; } public IQueryable CreateQuery(expression expression) { return new TestAsyncEnumerable<TEntity>(expression); } public IQueryable<TElement> CreateQuery<TElement>(expression expression) { return new TestAsyncEnumerable<TElement>(expression); } public object Execute(expression expression) { return _inner.Execute(expression); } public TResult Execute<TResult>(expression expression) { return _inner.Execute<TResult>(expression); } public IAsyncEnumerable<TResult> ExecuteAsync<TResult>(expression expression) { return new TestAsyncEnumerable<TResult>(expression); } public Task<TResult> ExecuteAsync<TResult>(expression expression, CancellationToken cancellationToken) { return Task.FromResult(Execute<TResult>(expression)); }}internal class TestAsyncEnumerable<T> : EnumerableQuery<T>, IAsyncEnumerable<T>, IQueryable<T>{ public TestAsyncEnumerable(IEnumerable<T> enumerable) : base(enumerable) { } public TestAsyncEnumerable(expression expression) : base(expression) { } public IAsyncEnumerator<T> GetEnumerator() { return new TestAsyncEnumerator<T>(this.AsEnumerable().GetEnumerator()); } IQueryProvider IQueryable.Provider { get { return new TestAsyncQueryProvider<T>(this); } }}internal class TestAsyncEnumerator<T> : IAsyncEnumerator<T>{ private readonly IEnumerator<T> _inner; public TestAsyncEnumerator(IEnumerator<T> inner) { _inner = inner; } public void Dispose() { _inner.Dispose(); } public T Current { get { return _inner.Current; } } public Task<bool> MoveNext(CancellationToken cancellationToken) { return Task.FromResult(_inner.MoveNext()); }}这是我使用这些类的更新的测试用例:
[Fact]public async Task GetCompanyProductURLAsync_ReturnsNullForInvalidCompanyProduct(){ var companyProducts = Enumerable.Empty<CompanyProductUrl>().AsQueryable(); var mockSet = new Mock<DbSet<CompanyProductUrl>>(); mockSet.As<IAsyncEnumerable<CompanyProductUrl>>() .Setup(m => m.GetEnumerator()) .Returns(new TestAsyncEnumerator<CompanyProductUrl>(companyProducts.GetEnumerator())); mockSet.As<IQueryable<CompanyProductUrl>>() .Setup(m => m.Provider) .Returns(new TestAsyncQueryProvider<CompanyProductUrl>(companyProducts.Provider)); mockSet.As<IQueryable<CompanyProductUrl>>().Setup(m => m.expression).Returns(companyProducts.expression); mockSet.As<IQueryable<CompanyProductUrl>>().Setup(m => m.ElementType).Returns(companyProducts.ElementType); mockSet.As<IQueryable<CompanyProductUrl>>().Setup(m => m.GetEnumerator()).Returns(() => companyProducts.GetEnumerator()); var contextOptions = new DbContextOptions<SaasDispatcherDbContext>(); var mockContext = new Mock<SaasDispatcherDbContext>(contextOptions); mockContext.Setup(c => c.Set<CompanyProductUrl>()).Returns(mockSet.Object); var entityRepository = new EntityRepository<CompanyProductUrl>(mockContext.Object); var service = new CompanyProductService(entityRepository); var result = await service.GetCompanyProductURLAsync(Guid.NewGuid(), "wot", Guid.NewGuid()); Assert.Null(result);}


