ale*_*dru 9 tdd unit-testing mocking stubs
我刚开始用C#阅读专业测试驱动开发:使用TDD开发真实世界的应用程序
我很难理解存根,假货和嘲笑.从我到目前为止的理解,它们是用于单元测试项目的假对象,而mock是一个带有条件逻辑的存根.
我认为我接受的另一件事是,模拟与依赖注入有某种联系,这是我昨天才能理解的概念.
我没有得到的是为什么我会实际使用它们.我似乎无法在网上找到任何正确解释它们的具体例子.
任何人都可以向我解释这个概念吗?
Jas*_*ans 21
正如我过去所读到的,这就是我认为每个术语所代表的含义
存根
在这里,您将方法的结果存根到已知值,只是让代码运行没有问题.例如,假设您有以下内容:
public int CalculateDiskSize(string networkShareName)
{
// This method does things on a network drive.
}
Run Code Online (Sandbox Code Playgroud)
你不关心这个方法的返回值是什么,它不相关.此外,如果网络驱动器不可用,它可能会在执行时导致异常.因此,您将结果存根以避免该方法的潜在执行问题.
所以你最终做了类似的事情:
sut.WhenCalled(() => sut.CalculateDiskSize()).Returns(10);
Run Code Online (Sandbox Code Playgroud)
假
假冒你正在返回虚假数据,或者创建虚假的对象实例.一个典型的例子是存储库类.采取这种方法:
public int CalculateTotalSalary(IList<Employee> employees) { }
Run Code Online (Sandbox Code Playgroud)
通常,上述方法将传递从数据库中读取的员工集合.但是,在单元测试中,您不希望访问数据库.所以你创建一个假的员工名单:
IList<Employee> fakeEmployees = new List<Employee>();
Run Code Online (Sandbox Code Playgroud)
然后,您可以向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());
}
Run Code Online (Sandbox Code Playgroud)
希望以上内容有助于澄清一些事情.
编辑:Roy Osherove是测试驱动开发的知名倡导者,他有一些关于这个主题的非常好的信息.您可能会发现它非常有用: