RSpec "allow" 静默终止 "it" 块

RSpec "allow" silently terminates "it" block

我有一个这样的 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,而是在我的 类 上使用 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(注意下划线而不是 space)。