2016-10-15 2 views
0

Я пытаюсь написать модульный тест, насмехаясь. Мой тест издевается над методом 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. 

ответ

0

Для того, чтобы издеваться асинхронных запросов, нужно реализовать IDbAsyncQueryProvider интерфейс. Я не знаю, как вы реализуете метод GenerateMockDbSetForAsync, но здесь полный тотальный по издевательским методам async.

Testing with a mocking framework (EF6 onwards)

Testing with your own test doubles (EF6 onwards)

+0

Я уже пробовал это, но получаю ту же ошибку, но я обновил свой вопрос с методом расширения –

+0

изменить запрос 'Uow.User.GetAll(). Где (х = > x.EmailAddress == email) 'и проверьте, работает оно или нет. –

+0

, если вы хотите изменить этот запрос в моем коде, который я пытаюсь проверить, он работает –

Смежные вопросы