Moq 异步回调因多个参数而失败

Moq Async Callback Fails with multiple parameters

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

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

我正在将我的最小起订量设置为 return 回调,这样我就可以将调用 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

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

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

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

您在嘲笑 ws.DoSomethingAsync(),但并未将其设置为 return 任何东西。 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