Moq回调函数与out参数

9

我正在尝试使用Moq来模拟以下方法签名的回调:

ResponseHeader AddIncentives(
        Hs_transRow[] data,
        out ResponseBody responseBody);

我希望我的回调函数能够使用传入的数据。然而,我遇到了问题,我认为这是因为第二个参数是一个输出参数。我可以设置和返回数据,但是回调函数是一个问题。
这是我的当前设置:
var addIncentiveResponseBody = new ResponseBody();

mockCoinsService
.Setup(service => service.AddIncentives(It.IsAny<Hs_transRow[]>(), out addIncentiveResponseBody))
.Callback((Hs_transRow[] data, ResponseBody body) =>
{
    //I want to use the data variable here
})
.Returns(() => new ResponseHeader
{
     action = ResponseHeaderAction.RESPONSE,
});

当我将这段代码作为单元测试的一部分运行时,出现以下错误:
无效回调。使用参数(Hs_transRow[],ResponseBody&)设置的方法不能调用具有参数(Hs_transRow[],ResponseBody)的回调。
我可以看到存在一个&符号的差异,我认为这是因为该参数应该是一个输出参数。然而,如果我在回调中添加out关键字(并在回调中分配一个值),我会得到构建时间错误:
委托“Action”不接受两个参数。
Moq是否无法处理具有输出参数的方法的回调,还是我做错了什么?
【编辑】为了消除任何疑问,我不是在询问如何设置输出参数的值。这已经由以下行完成:
var addIncentiveResponseBody = new ResponseBody();

那个问题是关于给一个输出参数赋值的。我已经能够设置这个值了。我的问题是当有一个输出参数时,在回调函数中如何使用输入参数。输出参数的相关性不在于我想要设置它,而是它阻止了我在回调函数中使用数据变量。 - Tim
3
你有没有看过这个问题中Scott Wegner的答案?(https://dev59.com/-nNA5IYBdhLWcg3wKae3) - Jeroen Heier
谢谢您标记这个答案,如果它在我的情况下可行,我会更新这个问题并提供更多细节。 - Tim
1
确认一下,在这种情况下,Scott Wegner的答案是可行的,他的OutCallback重载为我解决了问题。 - Tim
1个回答

5
Jeroen Heier在评论中指出了这一点,但将其作为答案添加应该会更加明显。Scott Wegner编写了一个OutCallback overload,可以使用它。

使用方法如下:

mockCoinsService
    .Setup(service => service.AddIncentives(It.IsAny<Hs_transRow[]>(), out addIncentiveResponseBody))
    .OutCallback((Hs_transRow[] data, ResponseBody body) =>
    {
        //I can now use the data variable here
    })
    .Returns(() => new ResponseHeader
    {
         action = ResponseHeaderAction.RESPONSE,
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接