我在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)
这似乎很愚蠢。
有没有办法强制从内联自定义错误消息显示我的消息?
答案 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.