Rspec - 捕获 linux 进程的 stderr 输出

Rspec - capture stderr output of linux process

我想测试我的 bash 脚本将一些消息输出到 stderr。 我试试这个:

require 'rspec'

describe 'My behaviour' do

  it 'should do something' do
    expect { `echo "foo" 1>&2` }.to output.to_stderr
  end
end

但似乎在测试期间没有输出到 stderr。

RSpec 的 output.to_stderr 匹配器正在寻找写入 $stdout/$stderr 的内容——您的 shell 命令没有这样做,因为它作为一个单独的子进程运行。

为了对此进行测试,您需要明确捕获 shell 代码的 stdoutstderr。您可以使用 Open3 standard library, or for example use the rspec-bash gem:

很容易地构建您自己的实现
require 'rspec'
require 'rspec/bash'

describe 'My behaviour' do
  include Rspec::Bash

  let(:stubbed_env) { create_stubbed_env }

  it 'should do something' do
    stdout, stderr, status = stubbed_env.execute(
      'echo "foo" 1>&2'
    )
    expect(stderr).to eq('foo')
  end
end

找到一个不太精确但更容易阅读的方法:

require 'rspec'

describe 'My behaviour' do

  it 'should do something' do
    expect { system('echo "foo" 1>&2 ') }.to output.to_stderr_from_any_process
  end
end

AFAIU - 它无法检查确切的消息,但对我来说足够了