2017-04-21 121 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方法的类。