犀牛模拟调用异步任务方法
问题描述:
我想模拟一个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这东西不起作用。有人可以向我解释这一点吗?
答
首先,您应该将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
方法的类。