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
钩子之前。
我正在编写 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
钩子之前。