Rhino Mock 调用异步任务方法

Sim*_*s0n 1 c# rhino-mocks

我试图模拟一个 dbWriteService 方法,它在我调用它时返回一个聚合异常,即使一切都不为空。我对模拟和犀牛模拟非常陌生,所以我并没有真正解决这个问题。

这是我想在要测试的函数中模拟的部分:

public async Task<bool> SaveDataAsync(object data) {
...
    await _dbWriteService.UpdateAsync(data);
...
}
Run Code Online (Sandbox Code Playgroud)

我正在像这样嘲笑 writeService:

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

我遇到了这样的异常:

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
Run Code Online (Sandbox Code Playgroud)

我用模拟函数尝试了一些东西,但我不明白为什么这些东西不起作用。有人可以向我解释一下吗?

Ign*_*nas 6

首先,您应该更改GenerateStubGenerateMock以便您可以使用模拟功能。其次,最好在你的测试中使用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));
    }
Run Code Online (Sandbox Code Playgroud)

在我的情况下,Class1带有SaveDataAsync方法的类在哪里。