【发布时间】:2014-06-24 10:47:41
【问题描述】:
我使用 TDD 已经有一段时间了,但现在我正在研究模拟框架,但我没有得到一些东西。对于有经验的人来说,这个问题可能听起来很愚蠢,但我就是不明白。我使用的库是 Moq + xUnit。
问题
如果我明确说2 + 2 将在mock.Setup(x => x.Add(2, 2)).Returns(4); 这一行返回4 然后断言它,那么测试Calculator 类有什么意义?
当然结果是 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);
}
}
【问题讨论】:
-
目标是模拟对象的一部分,以便仅测试该对象的另一部分。你不测试什么被嘲笑,那没有意义。
-
你完全明白嘲笑的目的吗?
-
实际上是正确的,目的是隔离那个单独的部分。
-
您的示例实现案例很好地证明了使用
Add()测试计算Add(2,3)而不是 (2,2)。 -
@IamStalker 我知道目的是模拟存储库。但是为什么在示例中我会看到这样的类?这个类甚至应该使用嘲笑吗?我可以嘲笑一些事情而别管其他事情吗?
标签: c# unit-testing mocking tdd moq