模拟,存根和工厂女孩有什么区别?

时间:2011-09-07 21:38:05

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

我对rspec和整个TDD方法都很陌生。有人可以解释一下mock和stub之间的区别。我们何时使用它们,何时使用Factory Girl在测试用例中创建对象?

2 个答案:

答案 0 :(得分:16)

你的第一站是Martin Fowler的着名文章:Mocks are not Stubs

修改

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

来自维基百科:

实施例

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

*免责声明 - 我不是红宝石

答案 1 :(得分:16)

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

这是一个使用大量两者的相当人为的例子:

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对于生成测试数据非常有用。您可以使用工厂作为为模型创建实例的配方,您可能需要测试涉及大量测试数据的内容,这将是使用fixture无法工作并且显式创建复杂对象的情况可能很乏味。