为什么在Minitest测试中以非零退出fork?

时间:2018-12-25 14:46:20

标签: ruby fork minitest

这是代码:

require 'minitest/autorun'
class Foo < Minitest::Test
  def test_foo
    Process.fork do
      exit(0)
    end
    p Process.waitall
  end
end

这是输出:

$ ruby a.rb
Run options: --seed 40445

# Running:

[[41827, #<Process::Status: pid 41827 exit 1>]]
.

Finished in 0.016218s, 61.6599 runs/s, 0.0000 assertions/s.
1 runs, 0 assertions, 0 failures, 0 errors, 0 skips

为什么退出代码不为零?

没有Minitest的相同代码也可以正常工作:

Process.fork do
  exit(0)
end
p Process.waitall

怎么了?

1 个答案:

答案 0 :(得分:2)

https://github.com/seattlerb/minitest/issues/467

  

问题是fork复制了父进程的at_exit处理程序。 Minitest使用at_exit来运行测试,因此您正在努力做到这一点。在fork doco中:“子进程可以使用Kernel.exit!退出以避免运行任何at_exit函数。”