我正在自学moq
测试,并想知道在这种情况下我做错了什么。
我不确定要在返回类型中包含哪些内容。我知道通过在那里包含一个值,例如4,这将忽略MulitplyValues(2,2)
调用内的参数并将response.basepremium
设置为4.
我想测试MultiplyValues
方法是否有效,并根据参数值传递测试。我做错了什么?任何帮助将不胜感激
我现在已将我的测试更改为符合回复的以下内容。这是对的吗?
[Test]
public void MoqTestFindTax()
{
Mock<IPremiumResponse> premiumresponse = new Mock<IPremiumResponse>();
CalculateTax calcualtetax = new CalculateTax(premiumresponse.Object);
decimal i = 0.648m;
decimal totalsofar = 12.96m;
decimal tax = 0.05m;
premiumresponse
.Setup(x => x.MulitplyValues(It.IsAny<decimal>(), It.IsAny<decimal>())).Returns(i);
Assert.AreEqual(13.61, calcualtetax.FindTaxTotal(totalsofar, tax));
}
然后我创建了一个税务计算器类
public class CalculateTax
{
IPremiumResponse _response;
public CalculateTax(IPremiumResponse premiumresponse)
{
_response = premiumresponse;
}
public decimal FindTaxTotal(decimal val1, decimal val2)
{
return _response.MulitplyValues(val1,val2) + val1;
}
}
}
答案 0 :(得分:1)
你根本不需要模拟,你应该直接测试实现:
PremiumResponse response = new PremiumResponse();
Assert.AreEqual(4, response.MultiplyValues(2, 2));
当您测试依赖于该接口的不同代码段时,您将使用接口的模拟。目的是获得可预测的返回值,以便您可以正确地表达您的期望,并防止代码的某个区域中的任何潜在错误影响另一个区域的单元测试结果。
例如,假设您有另一个班级Foo
:
public class Foo
{
private IPremiumResponse _premiumResponse;
public Foo(IPremiumResponse premiumResponse)
{
_premiumResponse = premiumResponse;
}
public int DoSomeMathThenAddOne(int n)
{
return _premiumResponse.MultiplyValues(n, n) + 1;
}
}
您只想测试DoSomeMathThenAddOne
的“+ 1”功能,因为乘法单元在其他位置。 (一个蹩脚的例子,我知道。)单元测试可能看起来像这样:
Mock<IPremiumResponse> premiumresponse = new Mock<IPremiumResponse>();
Foo foo = new Foo(premiumresponse.Object);
premiumresponse.Setup(x => x.MulitplyValues(It.IsAny<decimal>(), It.IsAny<decimal>())).Returns(4);
Assert.AreEqual(5, foo.DoSomeMathThenAddOne(2));
答案 1 :(得分:0)
如果你想测试MultipleValues
方法,那么你不想嘲笑它。你想模仿那些让你的焦点远离MulitpleValues
的部分,而不是它自己的方法。
PremiumResponse response = new PremiumResponse();
var value = response.MultiplyValues(2, 2)
Assert.AreEqual(4, value);