期待rspec测试中的错误

Jos*_*ehl 27 rspec ruby-on-rails

我试图期待rspec测试中的错误.

lambda {Participant.create!({:user_id => three.id, :match_id => match.id, :team => 1})}.should raise_error StandardError
Run Code Online (Sandbox Code Playgroud)

现在我只是用StandardError它来确保它正常工作.

1) StandardError in 'Participant should never allow more participants than players'. 
   This game is already full.  Cannot add another player.
/home/josiah/Projects/Set-Match/app/models/participant.rb:12:in `do_not_exceed_player_count_in_match'
./spec/models/participant_spec.rb:24:
Run Code Online (Sandbox Code Playgroud)

它显然会抛出错误,但我的测试仍然失败.

思考?

Con*_*ion 45

从一段时间以来,至少在RSpec 2.5中,可以使用

expect {raise 'boom'}.to raise_error(RuntimeError, /boom/)
Run Code Online (Sandbox Code Playgroud)


Jon*_*ian 35

您的语法看起来正确.要进行调试,请简化以确保您的规范编码正确.

it "should raise an error" do
  lambda {raise "boom"}.should raise_error
end
Run Code Online (Sandbox Code Playgroud)

然后添加更多细节,直到它中断.

lambda {raise "boom"}.should raise_error(RuntimeError)
lambda {raise StandardError.new("boom")}.should raise_error(StandardError)
Run Code Online (Sandbox Code Playgroud)


cri*_*spy 5

我不得不与同样的症状作斗争:

def boom
  raise "boom"
end
boom.should raise_error
Run Code Online (Sandbox Code Playgroud)

上面的测试失败了,因为raise_error需要should调用Proc(由于技术原因,我想).因此,使用lambda包装方法调用可以正常工作:

  lambda { boom }.should raise_error
Run Code Online (Sandbox Code Playgroud)

不幸的是,文档没有明确说明,并且没有RSpec Exception可以揭示这种行为.这是一张两年的门票.

  • "boom.should raise_error"失败了,因为繁荣是在"应该"之前评估的; 另一方面,lambda由"should"本身调用. (2认同)