Rspec stub_const 竞争条件

Rspec stub_const race condition

我正在编写 rspec 这样的测试

describe Module do
  describe "method" do
    context "first_context" do
      before do
        stub_const("Module::CONST", "stub0")
      end
      # logic
    end

    context "second_context" do
      before do
        stub_const("Module::CONST", "stub0 stub1")
      end
      # logic
    end
  end
end

大约 75% 的时间测试通过,因为 stub_const 逻辑正常工作,但 25% 的时间竞争条件失败,第一个测试的 stub_const 流入第二个测试的 const,所以第二个测试的 Module::CONST 值为 "stub0"。为什么会这样?

我见过这种事情发生在 JRuby 上。您可以尝试在存根全局变量的任何代码周围添加显式锁定,或者 运行 每个示例都处于锁定状态:

$lock = Mutex.new

around do |example|
  $lock.synchronize do
    example.run
  end
end

确保这是在你的 before 钩子之前。