gpt4 book ai didi

ruby - 在 RSpec 期间抑制 STDOUT,但不抑制 Pry

转载 作者:行者123 更新时间:2023-12-05 07:35:06 25 4
gpt4 key购买 nike

我正在测试一个生成器,它将大量内容输出到 STDOUT。我想压制这个,对此有很多答案。

但我想仍然能够使用 pry 。现在,如果我需要窥探测试状态,我必须禁用抑制。

我正在使用这段代码。它完全绕过了 pry:

def suppress_output(&block)
@original_stderr = $stderr
@original_stdout = $stdout

$stderr = $stdout = StringIO.new

yield(block)

$stderr = @original_stderr
$stdout = @original_stdout
@original_stderr = nil
@original_stdout = nil
end

我把它换成了这个。它在 pry 动时停止,但继续抑制输出,因此您无能为力:

def suppress_output(&block)
orig_stderr = $stderr.clone
orig_stdout = $stdout.clone
$stderr.reopen File.new("/dev/null", "w")
$stdout.reopen File.new("/dev/null", "w")
yield(block)
rescue Exception => e
$stdout.reopen orig_stdout
$stderr.reopen orig_stderr
raise e
ensure
$stdout.reopen orig_stdout
$stderr.reopen orig_stderr
end

有什么办法既能吃我的蛋糕又能吃吗?

最佳答案

如果有人能想到办法,我还是想回答这个问题。这不是我唯一一次在测试中不得不抑制 STDOUT,而且场景并不总是与这一次相同。


但是,今天我想到,在这种情况下,更简单的解决方案是更改代码,而不是测试设置。

生成器使用的是 Thor,它非常强大,但在基础知识方面的文档非常不透明,而且多年来一直没有真正更新。当我在文档中挖掘时,我发现有一些静音功能。

调用 add_runtime_options!在我的主要Cli < Thor类,我得到一个全局 --quiet选项。这抑制了很多输出,但不是我需要的一切。 #say仍然打印。 #run本身是静音的,但我传递给它运行的任何 shell 命令都不是。

重写这些方法可以解决我剩下的问题:

no_commands do
def quiet?
!!options[:quiet]
end

def run(command, config = {})
config[:capture] ||= quiet?
super(command, config)
end

def say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
super(message, color, force_new_line) unless quiet?
end
end

我目前没有一个我只想抑制某些东西的用例,所以现在让它要么全有要么全无。

现在,我必须使用 quiet: true 在我的测试中显式创建 Cli 实例,但我可以在没有不需要的输出的情况下运行 RSpec,并且仍然使用 pry。

关于ruby - 在 RSpec 期间抑制 STDOUT,但不抑制 Pry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49746436/

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