我一直在使用TDD一段时间,但是现在我正在研究模拟框架,但我一无所获。对于一个经验丰富的人来说,这个问题听起来可能很愚蠢,但我不明白。我使用的库是Moq + xUnit。

问题

如果我明确地说Calculator将在此行2 + 2上返回4然后断言,则测试mock.Setup(x => x.Add(2, 2)).Returns(4);类有什么意义?

当然结果将是4,我只是“强制”它在测试本身上方几行中返回4。现在即使在我的实现中,如果我执行return a * b;而不是return a + b;,测试也将通过。

这是该计算器测试的另一个示例。 http://nsubstitute.github.io/

范例程式码

namespace UnitTestProject1
{
    using Xunit;
    using Moq;

    public class CalculatorTests
    {
        private readonly ICalculator _calculator;

        public CalculatorTests()
        {
            var mock = new Mock<ICalculator>();

            mock.Setup(x => x.Add(2, 2)).Returns(4);
            mock.Setup(x => x.Subtract(5, 2)).Returns(3);

            this._calculator = mock.Object;
        }

        [Fact]
        public void Calculator_Should_Add()
        {
            var result = _calculator.Add(2, 2);

            Assert.Equal(4, result);
        }

        [Fact]
        public void Calculator_Should_Subtract()
        {
            var result = _calculator.Subtract(5, 2);

            Assert.Equal(3, result);
        }
    }

    public class Calculator : ICalculator
    {
        public int Add(int a, int b)
        {
            return a + b;
        }

        public int Subtract(int a, int b)
        {
            return a - b;
        }
    }

    public interface ICalculator
    {
        int Add(int a, int b);
        int Subtract(int a, int b);
    }
}

最佳答案

目的是能够根据计算器来测试类,而无需计算器是自已的。在测试中,您知道计算器不能成为失败的原因,因为它返回了正确的答案。

通过隔离要测试的代码,您将能够测试实际的代码单元。并确切了解是什么导致您的测试失败。

关于c# - 模拟计算器类的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23518128/

10-12 02:25