我有一个RSpec测试,如下所示:
RSpec.describe 'outer' do
describe 'inner' do
context 'context' do
it 'my test' do
puts ":::: BEFORE"
allow(String).to receive(:broken?).and return(false)
puts ":::: AFTER"
expect(0).to eq(1) # Won't be executed
end
end
end
end
当然,在我自己的测试中,我不会在String
上使用allow
,而是在我的一个类上使用,但效果是一样的:当我运行此代码时,会打印BEFORE,但是AFTER没有打印(也没有执行allow
之后的任何其他操作。效果是,就好像allow
将终止测试一样。没有错误消息;RSpec只说"1个示例,0个失败"。
其他值得一提的事项:
RSpec-mocking是用mocks.verify_partial_doubles = true
配置的,但效果是相同的,这与我们用allow
指定现有方法还是(如我的示例中所示(不存在的方法无关。
使用config.warnings = true
打开警告。
知道allow
为什么会表现出这种行为吗?
您有一行:
allow(String).to receive(:broken?).and return(false)
这称为allow(String).to(receive(:broken?).and(return(false)))
因此,您调用return
关键字,该关键字无声地结束了示例。
您应该调用and_return
而不是and return
(请注意下划线而不是空格(。