请参阅以下代码:
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);
答案 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源代码中,它们实际上归结为相同的代码,因此也可以完成工作。