【问题标题】:Rspec stub_const race conditionRspec stub_const 竞争条件
【发布时间】:2020-08-15 15:12:40
【问题描述】:

我正在写这样的 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"。为什么会这样?

【问题讨论】:

  • 你怎么知道这是一个竞争条件?您是否并行运行测试?你的问题没有足够的信息。我复制了你的测试,运行了 100 次,没有一次失败。

标签: ruby-on-rails ruby rspec


【解决方案1】:

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

$lock = Mutex.new

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

确保这是在您的 before 挂钩之前。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2011-01-02
    • 2017-02-11
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多