【问题标题】:Moq Async Callback Fails with multiple parametersMoq 异步回调因多个参数而失败
【发布时间】:2016-02-22 16:34:29
【问题描述】:

如果这是我做错的事情,或者是最小起订量或 NUnit 的问题,我正在尝试锻炼。我正在调用一个肥皂端点,而我的服务引用正在生成同步和异步方法。我正在拨打的电话类似于:

public async Task DoThisAsync(idnameobject myobj, int id)
{
    await ws.DoSomethingAsync(myobj, id);
}

我正在设置我的最小起订量以返回回调,因此我可以将调用 Web 服务的参数与这些参数结合起来。我的测试看起来像:

var callback = new idnameobject();    

wsMock
.SetUp(w => w.DoSomethingAsync(It.IsAny<idnameobject>(), It.IsAny<int>())
.Callback<idnameobject, int>((obj, id) => callback = obj);

await myservice.DoThisAsync(myobj, id);

Assert.That(callback.Id, Is.EqualTo(myobj.Id));

此时,我在调用我的方法时得到一个空引用异常,该异常不包含堆栈跟踪中的任何信息。我只有Exception thrown: 'System.AggregateException' in mscorlib.dll 在输出中。

奇怪的是,如果我从同步方法设置回调并更改我的方法来调用它,它不会失败。

如果我调用只有一个参数的异步方法,它也不会失败。

如果有人有任何想法,请告诉我,因为我不想因为我们的测试而改变我的方法,但理想情况下我希望我的测试能够确保我正确地调用网络服务。

【问题讨论】:

    标签: c# asynchronous tdd nunit moq


    【解决方案1】:

    你在嘲笑ws.DoSomethingAsync(),但没有设置它来返回任何东西。 DoThisAsync() 方法将失败,因为它将尝试等待 null。您可以通过将设置代码更改为

    来解决此问题
    wsMock.SetUp(w => w.DoSomethingAsync(It.IsAny<idnameobject>(), It.IsAny<int>())
        .Callback<idnameobject, int>((obj, id) => callback = obj)
        .Returns(Task.FromResult(0));
    

    如果您使用的是 .NET 4.6 或更高版本,您可以将 Task.FromResult(0) 替换为 Task.CompletedTask

    【讨论】:

    • 很好的解释并解决了我的问题。希望我能把它标记为你的答案。
    • 对不起,这确实回答了我的问题,只是标记它有点慢
    • 感谢您的回答!非常有意义,并使我们免于进行更多调试/完全放弃该测试用例。 :P
    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多