我正在尝试锻炼,如果它是我做错了,或者是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服务。
答案 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
。