gpt4 book ai didi

ruby - Minitest `assert_output` 对 stderr 的错误检查

转载 作者:数据小太阳 更新时间:2023-10-29 08:44:29 24 4
gpt4 key购买 nike

我需要编写一些测试以通过 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 helper 。这将 $stdout$stderr 与两个 StringIO 交换,产生 block ,并交换 $stdout$stderr 回来。这是可能的,因为 $stdout$stderr 是变量。

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

关于ruby - Minitest `assert_output` 对 stderr 的错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34351144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com