【问题标题】:What's the difference between mock, stub, and factory girl?mock、stub 和 factory girl 有什么区别?
【发布时间】:2011-11-12 12:55:29
【问题描述】:

我对 rspec 和整个 TDD 方法还是很陌生。有人可以解释模拟和存根之间的区别。我们什么时候使用它们,什么时候使用 Factory Girl 在测试用例中创建对象?

【问题讨论】:

    标签: ruby-on-rails rspec mocking factory-bot


    【解决方案1】:

    您可以将模拟(或双重)视为假对象。当您正在测试并且需要使用在测试中不容易使用的对象时,您可以使用模拟作为您期望该对象如何表现和解决它的近似值。存根可以以类似的方式使用,但用于对象的单个方法。

    这是一个相当人为的例子,它同时使用了很多:

    class Client
      def connect_to_server
        if Server.connect.status == 'bad'
          show_an_error
        else
          do_something_else
        end
      end
      def do_something_else; end
      def show_an_error; end
    end
    
    context "failure" do
      it "displays an error" do
        bad_network_response = double("A bad response from some service", :status => 'bad')
        Server.should_receive(:connect).and_return(bad_network_response)
    
        client = Client.new
        client.should_receive(:show_an_error)
        client.connect_to_server
      end
    end
    

    您可以想象使用大量模拟或存根是一个坏主意;这基本上掩盖了测试中的部分代码,但是对于一些困难/罕见的测试场景来说,这是一个简单的解决方案。

    Factory Girl 可用于生成测试数据。您将使用工厂作为为您的模型创建实例的配方,您可能需要测试涉及大量测试数据的东西,而在这种情况下,使用夹具将不起作用并且显式创建复杂的对象可能很乏味。

    【讨论】:

    • 我可能是错的,但我认为你误认为存根只是在方法上。您可以有存根对象或模拟对象,或存根方法或模拟方法。不同之处在于您如何使用它们。存根只是让测试工作而不实际调用另一个依赖项。模拟做同样的事情,但调用是必需的,并且是测试的一部分。你可以有一个既有存根又有模拟的假对象。 Rspec 现在甚至称它们为“双重”而不是模拟。
    【解决方案2】:

    您的第一站是 Martin Fowler 的著名文章:Mocks are not Stubs

    编辑

    Mocks 和Stubs 是Test Doubles(Mezaros 术语)的两种类型。测试替身通常用于模拟被测系统(或被测类)所需的依赖关系,以便可以独立于其依赖关系来测试 SUT / CUT。 (警告 - 精确的术语可能是一个非常敏感的主题,例如 Jeff here 提到的)

    来自维基百科:

    示例

    • 当被 SUT 调用时,存根方法可能只返回一个常量值,例如用于执行 SUT 的特定测试用例。
    • *Mockito (Java) 和 Moq (.Net) 等框架允许您使用最少的代码即时针对依赖项的接口构建模拟类,并提供验证 SUT 是否与模拟,例如通过检查 SUT 使用正确的参数调用模拟方法的次数是否正确。

    * 免责声明 - 我不是 ruby​​ 开发人员

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2013-09-17
    • 2023-04-04
    • 2012-11-18
    相关资源
    最近更新 更多