RSpec - 如何复合匹配器raise_error和output.to_stdout?

时间:2016-12-21 15:36:32

标签: ruby rspec thor

我有一个基于Thor的ruby CLI项目,我正在尝试添加单元测试。它起初是一个宠物项目,现在内部相当大而重要。无论如何,我从来没有真正开始进行单元测试,只是嫁接到现有的例子上,所以当谈到rspec时我就是一个菜鸟。

我从一个相当基本的例子开始,确保如果我给它一个不存在的文件,它会回复一个解释性错误并退出。

以下是我尝试复合它们的方法:

context 'with incorrect filename' do
  it 'should fail cleanly' do
    expect do
      subject.format('bad_file_name')
    end.to output('   ERROR  Unable to load file bad_file_name, exiting...').to_stdout.and raise_error(SystemExit)
  end
end

有效但不能正确捕捉标准输出output here ..也尝试过:

context 'with incorrect filename' do
  it 'should fail cleanly' do
    expect do
      expect do
        subject.format('fixtures/invalid.yaml')
      end.to output('   ERROR  Unable to load file bad_file_name, exiting...').to_stdout
    end.to raise_error(SystemExit)
  end
end

看起来它有效,除了(如本例所示)它实际上并没有测试输出,因为输出不匹配。

那么检查引发的错误和同时输出到stdout的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

this works for me

expect { whatever }.to output('stderr message').to_stderr
                   .and output(Regexp.new('stdout message')).to_stdout
                   .and raise_error('Error message')