2016-10-15 1 views
0

私は単位テストを模擬して記述しようとしています。私のテストは、FirstOrDefaultAsyncメソッドを使用してGetAllメソッドを嘲笑しています。私がFirstOrDefaultAsyncFirstOrDefaultに変更すると、私のテストは正常に動作しますが、FirstOrDefaultAsyncを置くと失敗します。NSubstituteを使って、NSubstitute、エンティティ・フレームワークを使ってMocking FirstOrDefualtAscyncメソッドが例外をスローする

私のユニットテストコードは、私が

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 
を取得しています

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; 
    } 

例外をテストしようとしています

[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]"); 
} 

コードを下回っています

結果の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メソッドを実装しているのか分かりませんが、ここでは非同期メソッドを非公開にしています。

Testing with a mocking framework (EF6 onwards)

Testing with your own test doubles (EF6 onwards)

+0

私はすでにこれを試してみましたが、同じエラーを取得しますが、私は拡張メソッドで私の質問を更新したことは 'Uow.User.GetAll()にクエリを変更 –

+0

。ここで、(X = > x.EmailAddress == email) 'をチェックし、それが動作するかどうかをチェックします。 –

+0

私がテストしようとしているコードでそのクエリを変更すると言っているのであれば、テスト目的のために –

関連する問題