Rspec中的Rspec模拟和存根混淆

时间:2016-04-16 11:39:32

标签: ruby mocking stub

我对在Rspec中使测试成为存根测试或模拟测试的原因感到有些困惑。我认为最好从一些定义开始:

  • double 只是一个虚拟对象,用作我们正在测试的其他对象的代表。

    dummy = double("dummy")
    
  • stub 是一个伪对象,它为方法调用返回预定值,而不调用实际对象上的实际方法。一个例子:

    allow(test).to receive(:foo).and_return("bar")
    
  • mock 除了返回假值外,还设置了一个可测试的期望值,即在测试中实际调用被替换的方法。在其他任何意义上,它都与存根相同。一个例子:

    expect(test).to receive(:foo).and_return("bar")
    

    如果我们在测试中没有调用方法test.foo,它将返回测试失败。

什么使测试成为存根测试或模拟测试?通过查看语法,它们看起来几乎相同:

allow(test).to receive(:foo).and_return("bar")
expect(test).to receive(:foo).and_return("bar")

我看到的唯一区别是存根以allow方法开头,而模拟以expect方法开头。但是,我已经看到开发人员在存根测试中也使用expect方法,就像这样:

project = Project.new(name: "Project Greenlight")
allow(project).to receive(:name).and_return("Fred")
expect(project.name).to eq("Fred")

如果我使用allow(foo).to receive(:bar),它会使测试成为存根测试,但是当我使用expect(foo).to receive(:bar)语法构造时,它会将测试作为模拟测试吗?

0 个答案:

没有答案