Я пытаюсь написать модульный тест, насмехаясь. Мой тест издевается над методом GetAll
, который использует метод FirstOrDefaultAsync
. Если я изменю FirstOrDefaultAsync
на FirstOrDefault
, мой тест работает нормально, но он продолжает терпеть неудачу, когда я возвращаю FirstOrDefaultAsync
.Mocking, с NSubstitute, структура сущности FirstOrDefualtAscync метод исключает исключение
Мой блок кода тест ниже
[TestMethod]
public async Task GetAsync_WithUser_ReturnsOk()
{
var data = GetUserResult();
var mockContext = Substitute.For<IPostAnythingContext>();
var mockSet = data.GenerateMockDbSetForAsync();
mockContext.Users.Returns(mockSet);
uow.User.GetAll().Returns(data);
var result = await sut.GetAsync("[email protected]");
}
код Я пытаюсь проверить
public async Task<Result<Users>> GetAsync(string email)
{
var result = Uow.User.GetAll()
.Where(x => x.EmailAddress == email)
.Include(x => x.UsersUsersTypes);
return Result.Ok(await result.FirstOrDefaultAsync());
}
Мой метод расширения
public static DbSet<TEntity> GenerateMockDbSetForAsync<TEntity>(this IEnumerable<TEntity> queryableEnumerable) where TEntity : class
{
var queryable = queryableEnumerable as IQueryable<TEntity> ?? queryableEnumerable.AsQueryable();
var mockSet = Substitute.For<DbSet<TEntity>, IQueryable<TEntity>, IDbAsyncEnumerable<TEntity>>();
// async support
var castMockSet = (IQueryable<TEntity>)mockSet;
var castAsyncEnum = (IDbAsyncEnumerable<TEntity>)mockSet;
castAsyncEnum.GetAsyncEnumerator().Returns(new TestDbAsyncEnumerator<TEntity>(queryable.GetEnumerator()));
castMockSet.Provider.Returns(new TestDbAsyncQueryProvider<TEntity>(queryable.Provider));
castMockSet.Expression.Returns(queryable.Expression);
castMockSet.ElementType.Returns(queryable.ElementType);
castMockSet.GetEnumerator().Returns(queryable.GetEnumerator());
return mockSet;
}
Exception Я получаю
Test Name: GetAsync_WithUser_ReturnsOk
Test FullName: PostAnything.Business.Tests.UsersServiceTests.GetAsync_WithUser_ReturnsOk
Test Source: C:\TFS\PostAnything\PostAnything.Business.Tests\UsersServiceTests.cs : line 40
Test Outcome: Failed
Test Duration: 0:00:02.5118084
Результат StackTrace:
at System.Data.Entity.QueryableExtensions.FirstOrDefaultAsyncTSource
at System.Data.Entity.QueryableExtensions.FirstOrDefaultAsyncTSource
at PostAnything.Business.Implementation.UsersService.d__2.MoveNext() in C:\TFS\PostAnything\PostAnything.Business\Implementation\UsersService.cs:line 28
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at PostAnything.Business.Tests.UsersServiceTests.d__5.MoveNext() in C:\TFS\PostAnything\PostAnything.Business.Tests\UsersServiceTests.cs:line 49
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
Result Message:
Test method PostAnything.Business.Tests.UsersServiceTests.GetAsync_WithUser_ReturnsOk threw exception:
System.InvalidOperationException: The provider for the source IQueryable doesn't implement IDbAsyncQueryProvider. Only providers that implement IDbAsyncQueryProvider can be used for Entity Framework asynchronous operations. For more details see http://go.microsoft.com/fwlink/?LinkId=287068.
Я уже пробовал это, но получаю ту же ошибку, но я обновил свой вопрос с методом расширения –
изменить запрос 'Uow.User.GetAll(). Где (х = > x.EmailAddress == email) 'и проверьте, работает оно или нет. –
, если вы хотите изменить этот запрос в моем коде, который я пытаюсь проверить, он работает –