2017-04-21 125 views
1

我想模擬一個dbWriteService方法,當我調用它時返回一個聚合異常,即使一切都不爲空。我對嘲笑和犀牛模擬器很陌生,所以我沒有真正解決這個問題。犀牛模擬調用異步任務方法

這是我想在功能嘲笑的部分,我想測試:

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

首先,您應該將GenerateStub更改爲GenerateMock,以便您可以使用模擬功能。其次,在您的測試中使用await而不是.Result()會更好,並且測試方法返回類型可以是async Task。第三,似乎Rhino Mock希望你爲模擬設置返回值,可以設置爲Task.FromResult(0)

例如,要確保UpdateAsync被調用null值,最終結果爲true您可以使用MSTest編寫以下測試。

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

哪裏Class1是在我的情況SaveDataAsync方法的類。