2017-04-21 5 views
1

すべてがnullではないにもかかわらず、呼び出し時に集約例外を返すdbWriteServiceメソッドをモックしようとしています。私はまったく新しいことを嘲笑して鼻を乱すので、実際には問題はありません。Rhino Mockが非同期タスクメソッドを呼び出す

これは私がテストに私が欲しい機能でモックとしたい部分です:

public async Task<bool> SaveDataAsync(object data) { 
... 
    await _dbWriteService.UpdateAsync(data); 
... 
} 

私はこのようなwriteServiceをからかっています:

dbWriteService = MockRepository.GenerateStub<IDbWriteService>(); 
dbWriteService.Expect(service => service.UpdateAsync(null)); 
var wasSaved = subject.SaveDataAsync(data).Result; 
dbWriteService.AssertWasCalled(service => service.UpdateAsync(null)); 

と私はこのような例外を取得しています:

System.AggregateException: One or more errors occurred. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at ClearingDataRepository.<SaveDataAsync>d__28.MoveNext() in ....\ClearingDataRepository.cs:line 170 
--- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 
    at System.Threading.Tasks.Task`1.get_Result() 
    at UnitTests.Services.ClearingDataRepositoryTests.SaveDataAsync_Sucess() in ....\ClearingDataRepositoryTests.cs:line 90 

私は嘲笑機能をいくつかのことを試してみましたが、私は理由WHを得ることはありませんこのことはうまくいきません。誰も私にこのことを説明できますか?

答えて

2

まず、模擬機能を使用できるように、GenerateStubGenerateMockに変更する必要があります。第2に、.Result()の代わりにawaitを使用し、テストメソッドの戻り値の型をasync Taskにするとよいでしょう。そして第三に、Rhino Mockはモックの戻り値を設定したいと考えています。Task.FromResult(0)に設定することができます。

例えば、UpdateAsyncnullという値で呼び出され、最終結果がtrueであることを確認するには、MSTestで次のテストを書くことができます。 Class1は、私の場合はSaveDataAsyncメソッドを持つクラスです

[TestMethod] 
    public async Task TestMethod1() 
    { 
     // Arrange 
     var dbWriteService = MockRepository.GenerateMock<IDbWriteService>(); 
     dbWriteService.Expect(service => service.UpdateAsync(null)).Return(Task.FromResult(0)); 
     var subject = new Class1(dbWriteService); 

     // Act 
     var result = await subject.SaveDataAsync(null); 

     // Assert 
     Assert.IsTrue(result); 
     dbWriteService.AssertWasCalled(service => service.UpdateAsync(null)); 
    } 

関連する問題