了解存根,假货和嘲笑.

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是测试驱动开发的知名倡导者,他有一些关于这个主题的非常好的信息.您可能会发现它非常有用:

http://artofunittesting.com/