Rspec:raise_error测试的自定义失败消息

时间:2014-08-26 04:55:42

标签: ruby-on-rails ruby rspec error-handling

我在customised failure messages访问包含capybara的页面时使用testing if an error was raised or not

我的代码:

expect(visit '/page/path').to_not raise_error(ActionView::Template::Error), "my custom error message"

我也试过使用lambda语法(lambda { "my custom error message" })但没有成功。

问题似乎是错误本身优先显示在我的自定义错误消息上。我对错误消息没兴趣 - 如果有人提出,我知道问题是什么,并且自定义错误消息给出了解决方案(这是一个涉及VCR的长篇故事)。

现在我有一个粗略的begin/rescue看起来像这样:

begin
  expect(visit '/page/path').to_not raise_error(ActionView::Template::Error)
rescue ActionView::Template::Error => error
  expect(1).to eq(0), "my custom error message"
end

但是,正如你所看到的,我必须编写一个假的,总是失败的测试,expect(1).to eq(0)这似乎很愚蠢。

有没有办法强制从内联自定义错误消息显示我的消息?

2 个答案:

答案 0 :(得分:2)

首先,您需要将要执行的块传递给expect方法,以便raise_error匹配器捕获块中引发的错误。也许令人惊讶的是,以下因为这个原因失败了:

describe 'Foo' do
  it 'raises an error' do
    expect(fail "wat").to raise_error(RuntimeError)
  end
end

但是,如果我们按照以下方式重新编写该期望,则通过:

expect{fail "wat"}.to raise_error(RuntimeError)

正如Rob提到的那样,如果你想指定一个错误没有提出,你需要写下你的期望如下:

expect{fail "wat"}.to_not raise_error

并使用该格式,您可以指定自定义错误消息:

expect{fail "wat"}.to_not raise_error, "custom error message"

您的第二个代码块似乎工作的原因是您的visit '/page/path'引发异常,然后您的异常处理程序捕获它。它等同于以下内容:

begin
  visit '/page/path'
rescue ActionView::Template::Error => error
  expect(1).to eq(0), "my custom error message"
end

答案 1 :(得分:1)

我在本地工作:

expect { visit '/page/path' }.to_not raise_error, "Nope"

根据RSpec在测试结果中的大喊大叫,指出你期望 to_not 引发的异常类显然已被弃用了:

DEPRECATION: `expect { }.not_to raise_error(SpecificErrorClass)` is
deprecated. Use `expect { }.not_to raise_error` (with no args) instead.