RSpec,隐式主题和异常

Mar*_*rio 4 ruby rspec

有没有办法在rspec中使用隐式主题正确测试异常提升?

例如,这失败了:

describe 'test' do
  subject {raise 'an exception'}
  it {should raise_exception}
end
Run Code Online (Sandbox Code Playgroud)

但这传递了:

describe 'test' do
  it "should raise an exception" do
    lambda{raise 'an exception'}.should raise_exception
  end
end
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

Jer*_*man 7

subject接受一个返回剩余主题的块.

你想要的是这个:

describe 'test' do
  subject { lambda { raise 'an exception' } }
  it { should raise_exception }
end
Run Code Online (Sandbox Code Playgroud)

编辑:评论澄清

这个:

describe 'test' do
   subject { foo }
   it { should blah_blah_blah }
end
Run Code Online (Sandbox Code Playgroud)

或多或少相当于

(foo).should blah_blah_blah
Run Code Online (Sandbox Code Playgroud)

现在,考虑:没有lambda,这变成:

(raise 'an exception').should raise_exception
Run Code Online (Sandbox Code Playgroud)

在此处看到,在评估主题时(在should完全调用之前)会引发异常.而对于lambda,它变成:

lambda { raise 'an exception' }.should raise_exception
Run Code Online (Sandbox Code Playgroud)

这里,主题是lambda,仅在计算should调用时评估(在将捕获异常的上下文中).

虽然每次都会重新评估"主题",但它仍然需要评估您要调用的should内容.