我正在尝试使用Moq来模拟以下方法签名的回调:
ResponseHeader AddIncentives(
Hs_transRow[] data,
out ResponseBody responseBody);
我希望我的回调使用传入的数据。但是,我遇到的问题我认为是因为第二个参数是out参数。我可以毫无问题地设置和返回数据,但回调是一个问题。
这是我目前的设置:
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&amp;)不能使用参数调用回调(Hs_transRow [],ResponseBody)。
我可以看到有一个&符号差异,我假设是因为该参数应该是一个out参数。但是,如果我将out关键字添加到回调中(并在回调中为其分配值),则会出现构建时错误:
委托'行动'不会有两个论点。
Moq无法处理具有out参数的方法的回调,或者我做错了什么?
[编辑]为了澄清毫无疑问,我不是在问如何设置out参数的值。这已经在线上完成了:
var addIncentiveResponseBody = new ResponseBody();
答案 0 :(得分:2)
在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,
});