我一直在使用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/