C# 具有多个回调的SetupGet

C# 具有多个回调的SetupGet,c#,unit-testing,moq,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.Setu

请参阅下面的代码:

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));
mockBusinessLayer.Setup(m=>m.Calculate(It.IsAny(),It.IsAny()).Callback
(()=>mockBusinessLayer.SetupGet(y=>y.FirstNumber).Returns(Helper.FirstNumber));
mockBusinessLayer.Setup(m=>m.Calculate(It.IsAny(),It.IsAny()).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);
            }
        }
要计算的公共计算器(int NumberOne,int NumberTwo)
{
_计算器。计算(NumberOne,NumberTwo);
返回Mapper.Map(_changecoculator);
}
}
这样做是否更好:

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

你说:

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

但这并不完全正确:您对
Calculate
Setup
的调用是相同的,因此第二个调用会覆盖第一个调用。就好像第一次
设置
从未发生过一样

回调
中调用
SetupGet
是不必要的,而且容易混淆。我会这样设置:

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>()));
mockBusinessLayer.SetupGet(y=>y.FirstNumber).返回(Helper.FirstNumber)
mockBusinessLayer.SetupGet(y=>y.SecondNumber).Returns(Helper.SecondNumber)
mockBusinessLayer.Setup(m=>m.Calculate(It.IsAny(),It.IsAny());
无论何时获得
FirstNumber
,它都将返回
Helper.FirstNumber
,同样地,对于
SecondNumber
返回
Helper.SecondNumber


综上所述,如果没有更多的代码(什么是
\u Calculator
?你的
mockBusinessLayer
真的公开了
第一个数字
/
第二个数字
计算
?),就很难提供更完整的前进步骤。例如,您不显示
Mapper.Map
方法的设置,如果您想测试此方法,则需要此设置


作为对您的更新的响应

SetupGet
提供了一个稍微干净的API:您需要通过
Func
,而
Setup
将允许您通过
操作
;它返回一个稍微受限的
ISetupGet
接口
SetupGet
还有更好的语义,向读者表明您只打算设置get

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

你说:

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

但这并不完全正确:您对
Calculate
Setup
的调用是相同的,因此第二个调用会覆盖第一个调用。就好像第一次
设置
从未发生过一样

回调
中调用
SetupGet
是不必要的,而且容易混淆。我会这样设置:

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>()));
mockBusinessLayer.SetupGet(y=>y.FirstNumber).返回(Helper.FirstNumber)
mockBusinessLayer.SetupGet(y=>y.SecondNumber).Returns(Helper.SecondNumber)
mockBusinessLayer.Setup(m=>m.Calculate(It.IsAny(),It.IsAny());
无论何时获得
FirstNumber
,它都将返回
Helper.FirstNumber
,同样地,对于
SecondNumber
返回
Helper.SecondNumber


综上所述,如果没有更多的代码(什么是
\u Calculator
?你的
mockBusinessLayer
真的公开了
第一个数字
/
第二个数字
计算
?),就很难提供更完整的前进步骤。例如,您不显示
Mapper.Map
方法的设置,如果您想测试此方法,则需要此设置


作为对您的更新的响应

SetupGet
提供了一个稍微干净的API:您需要通过
Func
,而
Setup
将允许您通过
操作
;它返回一个稍微受限的
ISetupGet
接口
SetupGet
还有更好的语义,向读者表明您只打算设置get


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

这是出于设计。Moq仅识别成员上的最后一次设置。您要测试的是什么?@Nkosi,是否可以设置多个:SetupGet()显示您要测试的内容,让我们看看是否有帮助解决您的问题。@Nkosi,我添加了一个更新。出于好奇,您为什么要在
回调
方法中进行进一步的设置?为什么不一开始就把一切都安排好呢?这是设计的。Moq仅识别成员上的最后一次设置。您要测试的是什么?@Nkosi,是否可以设置多个:SetupGet()显示您要测试的内容,让我们看看是否有帮助解决您的问题。@Nkosi,我添加了一个更新。出于好奇,您为什么要在
回调
方法中进行进一步的设置?为什么不一开始就把一切都安排好呢?谢谢。使用SetupGet over Setup有什么好处?(请参阅我问题中的更新)。谢谢更新。最后,Kenneth K在他的评论(在我的OP下)中说:“一开始就设置好一切”。这就是你在这里所做的,还是有更好的方法?再次感谢。这就是我在这里所做的。一次设置所有内容通常更容易阅读。推杆