2016-02-22 31 views
8

我试图锻炼,如果它是我做错了,或者它在moq或NUnit中的问题。我正在调用一个肥皂端点,我的服务引用正在生成同步和异步方法。我正在通话,看起来像:Moq异步回调失败,带有多个参数

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

我建立我的MOQ返回回调,这样我就可以interegate参数我呼吁与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在输出。

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

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

如果任何人有任何想法,请让我知道,因为我不想改变我的方法,因为我们的测试,但理想情况下,我希望我的测试,以确保我正确调用Web服务。

回答

20

你在嘲笑ws.DoSomethingAsync(),但没有设置它返回任何东西。 DoThisAsync()方法将失败,因为它将尝试等待空值。您可以通过更改设置代码如果您使用的是.NET 4.6或修复这

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

上面你可以用Task.CompletedTask取代Task.FromResult(0)

+0

很好的解释和解决我的问题。希望我能把它标记为你的答案。 – mikesigs

+0

对不起,这确实回答了我的问题,只是稍微缓慢地将其标记为 – Tom