views:

32

answers:

2

I'm trying to expect an error in an rspec test.

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

For now I'm just using StandardError to make sure it's working.

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:

It clearly throws the error, but my test still fails.

Thoughts?

+1  A: 

Your syntax looks correct. To debug this, simplify to make sure your spec is coded correctly.

it "should raise an error" do
  lambda {raise "boom"}.should raise_error
end

And then add more detail until it breaks.

lambda {raise "boom"}.should raise_error(RuntimeError)
lambda {raise StandardError.new("boom")}.should raise_error(StandardError)
Jonathan Julian
Thanks for the tip.
Josiah Kiehl
A: 

I had to fight with the same symptoms:

def boom
  raise "boom"
end
boom.should raise_error

The test above fails because raise_error requires should to be called on a Proc (due to technical reasons, I suppose). Thus, wrapping a method call with a lambda works just fine:

  lambda { boom }.should raise_error

Unfortunately, the documentation does not say that explicitly and there is no RSpec Exception that reveals this behavior. There is a two year old ticket for that.

duddle