SetupGet有多个回调

时间:2017-05-31 13:03:07

标签: c# unit-testing moq

请参阅以下代码:

mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>())).Callback
            (() => mockBusinessLayer.SetupGet(y => y.FirstNumber).Returns(Helper.FirstNumber));
        mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>())).Callback
            (() => mockBusinessLayer.SetupGet(y => y.SecondNumber).Returns(Helper.SecondNumber));

Calculate()接受两个整数并将它们加在一起。如何在同一个模拟对象上设置多个SetupGets?上面的代码只在SecondNumber上设置Get回调(因为它是最后一次调用SetupGet)。

更新

这是我试图测试的功能:

public CalculatorDTO Calculate(int NumberOne, int NumberTwo)
        {
                _Calculator.Calculate(NumberOne, NumberTwo);
                return Mapper.Map<CalculatorDTO>(_changeCalculator);
            }
        }

这样做会更好:

mockBusinessLayer.Setup(x =&gt; x.FirstNumber).Returns(Helper.FirstNumber);             mockBusinessLayer.Setup(x =&gt; x.SecondNumber).Returns(Helper.SecondNumber);

1 个答案:

答案 0 :(得分:2)

你说:

  

上面的代码只在SecondNumber上设置了Get回调(因为它是最后一次调用SetupGet)。

但这并不完全正确:您对Setup的{​​{1}}的呼叫是相同的,因此第二个覆盖了第一个。好像第一个Calculate从未发生过。

Setup中的SetupGet来电置于Callback是不必要且令人困惑的。我把它设置成这样:

mockBusinessLayer.SetupGet(y => y.FirstNumber).Returns(Helper.FirstNumber)
mockBusinessLayer.SetupGet(y => y.SecondNumber).Returns(Helper.SecondNumber)
mockBusinessLayer.Setup(m => m.Calculate(It.IsAny<integer>(), It.IsAny<integer>()));

任何时候FirstNumber获得,它将返回Helper.FirstNumber,同样SecondNumber返回Helper.SecondNumber

所有这一切,没有更多的代码(_Calculator是什么类型?您的mockBusinessLayer是否真正公开FirstNumber / SecondNumber Calculate?)很难提供更完整的步骤来推进。例如,如果您要测试此方法,则不会显示Mapper.Map方法的设置。

回应您的更新......

SetupGet提供了一个稍微清晰的API:您需要传递Func,而Setup则允许您传递Action;它返回一个稍微受限制的ISetupGet接口。 SetupGet也有更好的语义,向读者表明你打算只设置get。

在Moq源代码中,它们实际上归结为相同的代码,因此也可以完成工作。