具有多个回调的 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).
但这不太正确:您对 Setup
和 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
得到,它会 return Helper.FirstNumber
,同样 SecondNumber
returning Helper.SecondNumber
.
说了这么多,没有你的代码(_Calculator
是什么类型?你的 mockBusinessLayer
真的暴露了 FirstNumber
/SecondNumber
and Calculate
?) 很难提供更完整的步骤来向前推进。例如,您没有显示 Mapper.Map
方法的设置,如果您想测试此方法,则需要它。
响应您的更新...
SetupGet
提供了一个稍微干净的 API:你需要传递一个 Func
,而 Setup
将允许你传递一个 Action
;它 return 是一个更受限制的 ISetupGet
界面。 SetupGet
也有更好的语义,向读者表明您打算只设置 get。
在最小起订量源代码中,它们实际上归结为相同的代码,因此要么同样完成工作。
请看下面的代码:
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).
但这不太正确:您对 Setup
和 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
得到,它会 return Helper.FirstNumber
,同样 SecondNumber
returning Helper.SecondNumber
.
说了这么多,没有你的代码(_Calculator
是什么类型?你的 mockBusinessLayer
真的暴露了 FirstNumber
/SecondNumber
and Calculate
?) 很难提供更完整的步骤来向前推进。例如,您没有显示 Mapper.Map
方法的设置,如果您想测试此方法,则需要它。
响应您的更新...
SetupGet
提供了一个稍微干净的 API:你需要传递一个 Func
,而 Setup
将允许你传递一个 Action
;它 return 是一个更受限制的 ISetupGet
界面。 SetupGet
也有更好的语义,向读者表明您打算只设置 get。
在最小起订量源代码中,它们实际上归结为相同的代码,因此要么同样完成工作。