正如我过去所读到的,这就是我认为每个术语所代表的含义
存根
在这里,您将方法的结果存根为已知值,只是为了让代码运行没有问题。例如,假设您有以下内容:
public int CalculateDiskSize(string networkShareName)
{
// This method does things on a network drive.
}
你不关心这个方法的返回值是什么,它不相关。另外,如果网络驱动器不可用,则执行时可能会导致异常。因此,您将结果存根以避免该方法的潜在执行问题。
所以你最终会做这样的事情:
sut.WhenCalled(() => sut.CalculateDiskSize()).Returns(10);
假的
使用 fake 是在返回虚假数据,或创建对象的虚假实例。一个经典的例子是存储库类。采取这种方法:
public int CalculateTotalSalary(IList<Employee> employees) { }
通常,上述方法将传递从数据库中读取的员工集合。但是,在您的单元测试中,您不想访问数据库。所以你创建了一个虚假的员工列表:
IList<Employee> fakeEmployees = new List<Employee>();
然后您可以将项目添加到 fakeEmployees 并断言预期结果,在本例中为总工资。
模拟
使用模拟对象时,您打算验证这些模拟对象的某些行为或数据。示例:
您想验证在测试运行期间是否执行了特定方法,这是一个使用 Moq 模拟框架的通用示例:
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/