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
是变量。
STDOUT
和 STDERR
是在 Object class 上定义的常量。因此它们不能像 $stdout
和 $stderr
那样交换。执行 STDERR.puts
时,输出未被 minitest 助手捕获,断言失败。
我需要通过 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
是变量。
STDOUT
和 STDERR
是在 Object class 上定义的常量。因此它们不能像 $stdout
和 $stderr
那样交换。执行 STDERR.puts
时,输出未被 minitest 助手捕获,断言失败。