【问题标题】:Suppress STDOUT during RSpec, but not Pry在 RSpec 期间抑制 STDOUT,但不是 Pry
【发布时间】:2023-03-26 03:40:01
【问题描述】:

我正在测试一个生成器,它会向 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

我用这个代替了它。它停在撬动处,但继续抑制输出,因此您无能为力:

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

有什么方法可以让我的蛋糕也吃吗?

【问题讨论】:

  • 您可以从 pry 会话中调用的另一种方法 enable_output 怎么样?
  • 这仍然是一种令人讨厌的解决方法。在这种情况下,由于我使用的库,我意识到最好的解决方案是更改代码,而不是测试设置。

标签: ruby rspec pry


【解决方案1】:

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


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

生成器使用的是 Thor,它非常强大,但在基础知识之外的文档非常不透明,并且多年来没有真正更新。当我翻遍文档时,我发现有一些静音功能。

通过在我的主要Cli < Thor 类中调用add_runtime_options!,我得到一个全局--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。

【讨论】:

    【解决方案2】:

    我发现Chris Houghthis solution 可以在我的情况下工作,将以下配置添加到spec/spec_helper

    RSpec.configure do |config|
      config.before(:each) do
        allow($stdout).to receive(:write)
      end
    end
    

    这替换了 :all before 块,它设置了以下内容(并在 after 块中反转分配):

    $stderr = File.open(File::NULL, "w")
    $stdout = File.open(File::NULL, "w")
    

    修复仍然抑制输出,同时允许 Pry 按预期运行。

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多