Minitest `assert_output` 对 stderr 的错误检查

Minitest `assert_output` incorrect check for stderr

我需要通过 minitest 编写一些测试以检查输出到 STDERR
它工作正常,如果我想检查到 STDOUT 的输出,但如果尝试检查 STDERR - asser_output 根本不会捕获其中的任何字符串

所以我的代码是这样的:

require 'minitest/autorun'

class OutputTest < MiniTest::Test
  def test_output_stdout
    assert_output(/Test/, '') {puts 'Test'}
  end

  def test_output_stderr
    assert_output('', /Test/) {STDERR.puts 'Test'}
  end
end

它给我错误:

 1) Failure:
OutputTest#test_output_stderr [test/assert_test.rb:9]:
In stderr.
Expected /Test/ to match "".

2 runs, 4 assertions, 1 failures, 0 errors, 0 skips

来自 assert_output documentation 此方法的第二个参数是用于检查 STDERR 的模式,但它不起作用。 我做错了什么?

如果您使用 $stderr 而不是 STDERR,它会起作用:

assert_output('', /Test/) { $stderr.puts 'Test' }

在内部,assert_output 使用 capture_io 助手。这将 $stdout$stderr 与两个 StringIO 交换,产生块,然后将 $stdout$stderr 交换回来。这是可能的,因为 $stdout$stderr 是变量。

STDOUTSTDERR 是在 Object class 上定义的常量。因此它们不能像 $stdout$stderr 那样交换。执行 STDERR.puts 时,输出未被 minitest 助手捕获,断言失败。