Ожидание ошибок в тестах rspec
Я пытаюсь ожидать ошибку в тесте rspec
.
lambda {Participant.create!({:user_id => three.id, :match_id => match.id, :team => 1})}.should raise_error StandardError
Пока я просто использую 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:
Он явно выдает ошибку, но мой тест все равно не работает.
Мысли?
Ответы
Ответ 1
Ваш синтаксис выглядит корректно. Чтобы отладить это, упростите, чтобы убедиться, что ваш spec правильно закодирован.
it "should raise an error" do
lambda {raise "boom"}.should raise_error
end
И затем добавьте больше деталей, пока не сломается.
lambda {raise "boom"}.should raise_error(RuntimeError)
lambda {raise StandardError.new("boom")}.should raise_error(StandardError)
Ответ 2
С некоторого времени, но по крайней мере в RSpec 2.5, можно использовать
expect {raise 'boom'}.to raise_error(RuntimeError, /boom/)
Ответ 3
Мне пришлось бороться с теми же симптомами:
def boom
raise "boom"
end
boom.should raise_error
Тест выше не выполняется, потому что raise_error
требует, чтобы should
вызывался на Proc
(по техническим причинам, я полагаю). Таким образом, обертывание вызова метода с помощью лямбда работает отлично:
lambda { boom }.should raise_error
К сожалению, документация не говорит об этом явно и не существует RSpec Exception, которая показывает это поведение. Для этого есть двухлетний билет.