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
。
如果这是我做错了什么,或者它是最小起订量或 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
。