I use XUNIT for testing in a kernel with a network core.
I need to test a service that internally creates an asynchronous DbSet request in my datacontext.
I saw here that it is mocking that DbSet is asynchronously possible.
The problem I am facing is that the IDbAsyncQueryProvider does not seem to be available in the EntityframeworkCore that I use.
Am I incorrect here? Has anyone else got this job?
(It was a long day, I hope I just missed something simple)
EDIT
After a GitHub request, I got an indication of this class: https://github.com/aspnet/EntityFramework/blob/dev/src/Microsoft.EntityFrameworkCore/Query/Internal/IAsyncQueryProvider.cs
This is what I still tried to implement:
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore.Query.Internal; namespace EFCoreTestQueryProvider { internal class TestAsyncQueryProvider<TEntity>: IAsyncQueryProvider { private readonly IQueryProvider _inner; internal TestAsyncQueryProvider(IQueryProvider inner) { _inner = inner; } IQueryable CreateQuery(Expression expression) { return new TestDbAsyncEnumerable<TEntity>(expression); } IQueryable<TElement> CreateQuery<TElement>(Expression expression) { return new TestDbAsyncEnumerable<TElement>(expression); } object Execute(Expression expression) { return _inner.Execute(expression); } TResult Execute<TResult>(Expression expression) { return _inner.Execute<TResult>(expression); } IAsyncEnumerable<TResult> ExecuteAsync<TResult>(Expression expression) { return Task.FromResult(Execute<TResult>(expression)).ToAsyncEnumerable(); } Task<TResult> IAsyncQueryProvider.ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken) { return Task.FromResult(Execute<TResult>(expression)); } } internal class TestDbAsyncEnumerable<T> : EnumerableQuery<T>, System.Collections.Generic.IAsyncEnumerable<T>, IQueryable<T> { public TestDbAsyncEnumerable(IEnumerable<T> enumerable) : base(enumerable) { } public TestDbAsyncEnumerable(Expression expression) : base(expression) { } public IAsyncEnumerator<T> GetAsyncEnumerator() { return new TestDbAsyncEnumerable<T>(this.AsEnumerable()).ToAsyncEnumerable(); } IDbAsyncEnumerator IDbAsyncEnumerable.GetAsyncEnumerator() { return GetAsyncEnumerator(); } IAsyncEnumerator<T> IAsyncEnumerable<T>.GetEnumerator() { throw new NotImplementedException(); } IQueryProvider IQueryable.Provider { get { return new TestAsyncQueryProvider<T>(this); } } } }
Now I tried to implement this and ran into some additional problems, especially around these two methods:
public IAsyncEnumerator<T> GetAsyncEnumerator() { return new TestDbAsyncEnumerable<T>(this.AsEnumerable()).ToAsyncEnumerable(); } IDbAsyncEnumerator IDbAsyncEnumerable.GetAsyncEnumerator() { return GetAsyncEnumerator(); }
I hope someone can point me in the right direction regarding what I am doing wrong.
source share