上下文中的Rspec raise_error似乎不起作用

时间:2015-03-16 18:17:59

标签: ruby rspec

我写了这个,然后就过去了。

it 'raises a GitConfigNotFound error when YAML config file cannot be found' do
    allow(YAML).to receive(:load_file)
                   .with(Rails.root.join('config', 'git_config.yml'))
                   .and_raise(Errno::ENOENT)
    expect { described_class::config }.to raise_error GitConfigNotFound
end

然后我试着将它放在一个上下文中以匹配我的其他测试,但它失败了。我的格式如下所示。有没有人知道为什么会这样?

context 'will raise a GitConfigNotFound exception if git config file is missing' do
    before do
      allow(YAML).to receive(:load_file)
                         .with(Rails.root.join('config', 'git_config.yml'))
                         .and_raise(Errno::ENOENT)
    end
    it { expect(described_class::config).to raise_error GitConfigNotFound }
  end

它给了我这个输出,这似乎是我想要的但是由于某种原因没有抓住它:

  1) GitConfigsLoader will raise a GitConfigNotFound exception if git config file is missing 
     Failure/Error: it { expect(described_class::config).to raise_error }
     GitConfigNotFound:
      Error: git_config.yml not found.
     # ./lib/git_configs_loader.rb:9:in `rescue in config'
     # ./lib/git_configs_loader.rb:7:in `config'
     # ./spec/lib/git_configs_loader_spec.rb:37:in `block (3 levels) in <top (required)>'

1 个答案:

答案 0 :(得分:2)

也许这就是@PeterAlfvin的意思,但我终于在答案中找到了答案!我使用的是expect(...)而不是expect{...}。 parens会立即执行并立即爆炸,并且不会被.to raise_exception捕获。使用大括号允许raise_error执行except块并捕获错误。

context 'when no git_config.yml file is proivded' do
   before do
    allow(YAML).to receive(:load_file).and_raise(Errno::ENOENT)
   end
   it { expect{ described_class::config }.to raise_exception GitConfigNotFound }
end