我对在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)
语法构造时,它会将测试作为模拟测试吗?