Rspec - 捕获 Linux 进程的 stderr 输出

4

我想测试一下我的bash脚本是否可以输出一些信息到stderr。 我尝试了这个命令:

require 'rspec'

describe 'My behaviour' do

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

但是似乎标准错误输出并没有在测试期间发生。

2个回答

3
RSpec的output.to_stderr匹配器寻找写入$stdout/$stderr的内容,但您的shell命令并未这样做,因为它作为单独的子进程运行。
为了测试这个问题,您需要显式地捕获shell代码的stdoutstderr。您可以使用Open3标准库构建自己的实现,或者例如使用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

1
发现一种不太精确,但更易于阅读的方法:
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 - 它无法检查确切的消息,但对我来说已足够。


2
你可以检查确切的消息:.to output('foo').to_std_error_from_any_process -- 阅读文档 - Tom Lord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接