Moq异步回调失败,有多个参数

时间:2016-02-22 16:34:30

标签: c# asynchronous tdd nunit moq

我正在尝试锻炼,如果它是我做错了,或者是moq或NUnit中的问题。我正在调用soap端点,我的服务引用正在生成同步和异步方法。我正在打电话,看起来像是:

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

我正在设置我的moq以返回回调,因此我可以将我称之为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));

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

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

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

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

1 个答案:

答案 0 :(得分:40)

你在嘲笑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