我可以在块匹配器中使用is_expected吗?

时间:2015-09-23 00:15:55

标签: rspec

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一起使用的块?

1 个答案:

答案 0 :(得分:1)

the documentationis_expected只相当于expect(subject)。通过评估StandardError参数subject来提升您获得的is_expected。匹配器永远不会被调用。

is_expected采取阻止是没有意义的,因为其目的是隐含地对subject进行操作。但是,如果将subject定义为ProcLambda,那么它就会按照您的预期执行,如下所示:

describe 'foo' do
  subject{ Proc.new { foo } }
  specify{ expect{ subject.call }.to raise_error }
  it{ is_expected.to raise_error }
end