【问题标题】:TDD and mockingTDD 和模拟
【发布时间】:2011-04-06 21:57:52
【问题描述】:

首先,我不得不说,我是嘲笑的新手。所以也许我错过了一点。

我也刚刚开始习惯 TDD 方法。

因此,在我的实际项目中,我正在处理业务层中的一个类,而数据层尚未部署。我想,这将是开始嘲笑的好时机。我正在使用 Rhino Mocks,但我遇到了在编写类本身之前需要了解类的实现细节的问题。

Rhino Mocks 检查所有预期调用的方法是否被实际调用。所以我经常需要知道被测试的方法首先调用了哪个模拟方法,即使它们可以按任何顺序调用。因此,我经常在测试之前编写复杂的方法,因为那时我已经知道方法被调用的顺序。

简单示例:

public void CreateAandB(bool arg1, bool arg2) {
    if(arg1)
        daoA.Create();
    else throw new exception;
    if(arg2)
        daoB.Create();
    else throw new exception;
}

如果我想测试这个方法的错误处理,我必须知道首先调用的是哪个方法。但是我不想在第一次编写测试时被实现细节所困扰。

我错过了什么吗?

【问题讨论】:

    标签: tdd mocking


    【解决方案1】:

    您有 2 个选择。如果该方法应该导致您的类发生一些变化,您可以改为测试您的方法的 results。所以你能不能打电话给CreateAandB(true,false),然后调用其他方法来查看是否创建了正确的东西。在这种情况下,您的模拟对象可能是只提供一些数据的存根。

    如果doaAdoaB 是注入到您的类中的对象,它们实际上在数据库或类似物中创建数据,而您无法在测试中验证结果,那么您想测试交互使用它们,在这种情况下,您创建模拟并设置期望,然后调用该方法并验证是否满足期望。在这种情况下,您的模拟对象将是模拟对象,并将验证预期的行为。

    是的,您正在测试实现细节,但是您正在测试如果您的方法正确使用其依赖项的细节,这是您要测试的内容,而不是如何它正在使用它们,这是您并不真正感兴趣的细节。

    编辑

    IDao daoA = MockRepository.GenerateMock<IDao>(); //create mock
    daoA.Expect(dao=>dao.Create); //set expectation
    
    ...
    
    daoA.VerifyExpectations(); //check that the Create method was called
    

    您可以确保期望以特定顺序发生,但不使用我认为的 AAA 语法(source from 2009,此后可能已更改,编辑see here 以获取可能有效的选项 ),但似乎有人开发了一种方法,可能允许此here。我从未使用过,无法验证。

    至于需要知道首先调用了哪个方法以便您可以验证异常,您有两个选择:

    • 在您的异常中包含不同的消息并检查以确定引发了哪个异常。
    • 除了期待异常之外,还期待对 daoA 的调用。如果您没有接到对 daoA 的调用,那么测试将失败,因为异常必须是第一个异常。

    【讨论】:

    • daoA 和 daoB 正在被注入,它们正在创建某事。在数据库中。因此,如果我想测试上面的示例,那么测试异常处理是否有意义?但问题并没有由此解决。我必须知道是否在 arg2 之前测试了 arg1。
    • 假设 doa 实现了某个接口,那么您可以测试 daoA 是否调用了它的 Create 方法,doaB 也是如此。您可以通过对模拟设置期望来做到这一点。我会在我的答案中添加一些细节。
    • 我想我开始明白了。我会通读您的链接并尝试您提到的内容。感谢您的帮助
    【解决方案2】:

    通常你只需要假对象,而不是模拟。模拟对象旨在测试组件交互,通常可以通过直接查询 SUT 的状态来避免这种情况。模拟的最实际用途是测试与某些外部系统(数据库、文件系统、Web 服务等)的交互,而对于其他事情,您应该能够直接查询系统状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      相关资源
      最近更新 更多