raise_error
是一个支持阻止期望的匹配器。
下面我有一个规范测试,foo
方法会引发错误:
require 'rspec'
def foo
raise StandardError
end
describe 'foo' do
subject{ foo }
specify{ expect{ subject }.to raise_error }
it{ is_expected.to raise_error }
end
现在,specify{ expect{ foo }.to raise_error }
按预期传递,但it{ is_expected.to raise_error }
失败。它失败是因为StandardError
被引发并且raise_error
匹配器没有获救。
那么我可以使用is_expected
的块吗?还是我注定要一遍又一遍地写specify{ expect{ subject }
? rspec是否会支持将来与is_expected
一起使用的块?
答案 0 :(得分:1)
每the documentation,is_expected
只相当于expect(subject)
。通过评估StandardError
参数subject
来提升您获得的is_expected
。匹配器永远不会被调用。
is_expected
采取阻止是没有意义的,因为其目的是隐含地对subject
进行操作。但是,如果将subject
定义为Proc
或Lambda
,那么它就会按照您的预期执行,如下所示:
describe 'foo' do
subject{ Proc.new { foo } }
specify{ expect{ subject.call }.to raise_error }
it{ is_expected.to raise_error }
end