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 代码的 stdout
和 stderr
。您可以使用 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 - 它无法检查确切的消息,但对我来说足够了
我想测试我的 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 代码的 stdout
和 stderr
。您可以使用 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 - 它无法检查确切的消息,但对我来说足够了