带有参数

时间:2016-03-16 13:28:24

标签: c# unit-testing moq

我正在尝试使用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();

1 个答案:

答案 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,
    });