正如我过去读过,这里是什么,我相信每个词代表
存根
这里你磕碰到已知值的方法的结果,只是为了让代码运行没有问题。例如,可以说你有以下几点:
public int CalculateDiskSize(string networkShareName)
{
// This method does things on a network drive.
}
你不在乎这个方法的返回值是什么,它是不相关的。另外,如果网络驱动器不可用,则可能会导致异常。所以你存根结果,以避免该方法潜在的执行问题。
所以,你最终做类似:
sut.WhenCalled(() => sut.CalculateDiskSize()).Returns(10);
假
与你正在返回假数据,或创建一个对象的实例伪造假的。一个典型的例子是存储库类。采取这种方法:
public int CalculateTotalSalary(IList<Employee> employees) { }
通常上述方法将传递从数据库中读取的雇员的集合。但是在你的单元测试中,你不想访问数据库。所以你创建一个假的员工列表:
IList<Employee> fakeEmployees = new List<Employee>();
然后,您可以将项目添加到fakeEmployees并断言预期的结果,在这种情况下,工资总额。
嘲笑
当使用模拟对象,你打算验证某些行为,或数据,这些模拟对象。例如:
要验证一个特定的方法是试运行期间执行,这是一个使用起订量嘲讽框架一般示例:
public void Test()
{
// Arrange.
var mock = new Mock<ISomething>();
mock.Expect(m => m.MethodToCheckIfCalled()).Verifiable();
var sut = new ThingToTest();
// Act.
sut.DoSomething(mock.Object);
// Assert
mock.Verify(m => m.MethodToCheckIfCalled());
}
希望上面有助于澄清事情有点。
编辑: Roy Osherove是测试驱动开发的知名倡导者,他有一些关于该主题的非常好的信息。您可能会发现它非常有用:
http://artofunittesting.com/
阅读本http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html这http://martinfowler.com/articles/mocksArentStubs.html – blank 2013-02-15 10:13:16
虽然你在你不妨阅读这个http://www.mockobjects.com/files/mockrolesnotobjects.pdf – blank 2013-02-15 10:21:18
我希望你能赦免商业广告,但是我们写了一本完整的书“面向对象的软件”,解决了动机使用嘲笑。 – 2013-04-27 10:52:39