具有多个回调的 SetupGet

SetupGet with multiple callbacks

请看下面的代码:

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() 接受两个整数并将它们相加。如何在同一个模拟对象上设置多个 SetupGet?上面的代码只在SecondNumber上设置了Get回调(因为这是最后一次调用SetupGet)。

更新

这是我要测试的功能:

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

这样做比较好:

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

你说:

The above code only sets up the Get callback on SecondNumber (because it is the last time SetupGet is called).

但这不太正确:您对 SetupCalculate 的调用是相同的,因此第二个调用覆盖了第一个。就好像第一个 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 得到,它会 return Helper.FirstNumber,同样 SecondNumber returning Helper.SecondNumber.


说了这么多,没有你的代码(_Calculator 是什么类型?你的 mockBusinessLayer 真的暴露了 FirstNumber/SecondNumber and Calculate?) 很难提供更完整的步骤来向前推进。例如,您没有显示 Mapper.Map 方法的设置,如果您想测试此方法,则需要它。


响应您的更新...

SetupGet 提供了一个稍微干净的 API:你需要传递一个 Func,而 Setup 将允许你传递一个 Action ;它 return 是一个更受限制的 ISetupGet 界面。 SetupGet 也有更好的语义,向读者表明您打算只设置 get。

在最小起订量源代码中,它们实际上归结为相同的代码,因此要么同样完成工作。