0

我正在自学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;
       }

}

}

4

2 回答 2

1

您根本不需要 Mock,您应该直接测试实现:

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;
    }
}

您只想测试 的“+ 1”功能DoSomeMathThenAddOne,因为乘法单元在别处。(一个蹩脚的例子,我知道。)单元测试可能看起来像这样:

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));
于 2013-09-11T19:46:20.480 回答
0

如果您想测试MultipleValues方法,那么您不想模拟它。你想模拟那些让你的注意力远离的部分MulitpleValues,而不是它自己的方法。

PremiumResponse response = new PremiumResponse();
var value = response.MultiplyValues(2, 2)
Assert.AreEqual(4, value);
于 2013-09-11T19:48:35.223 回答