Я подумал об этом еще раз, и, возможно, ответ:
Не существует элегантного решения, поскольку в вашем случае нарушается схема Given-When-Then -Scheme.
Вы ожидаете, что «Тогда должно быть выброшено исключение» - это результат «Когда я делаю что-то нежелательное».
Но когда вы думаете об этом, это не так! Исключение не является результатом этого действия, на самом деле исключение просто показывает, что условие «Когда» не выполнено.
Мое решение для этого было бы проверить на более высоком уровне:
When I do something unwanted
Then an error should be logged
или
When I do something unwanted
Then the user should get an error message
или
When I do something unwanted
Then the program should be locked in state "error"
или их комбинация.
Тогда вы «кэшируете исключение» в своей программе, что вполне логично, так как вам, скорее всего, придется это делать.
Обе проблемы, о которых вы говорили, также будут решены.
В случае, если вы действительно должны проверить исключения
Ну, я думаю, тогда огурец - не тот набор тестов, а? ; -)
Поскольку схема «задано-тогда-потом» нарушается, я бы просто написал
When I do something unwanted it should fail with "ArgumentError"
и в определениях шагов что-то вроде (не проверено, пожалуйста, исправьте меня, если вы попробуете)
When /^I do something unwanted it should fail with "(.*)"$/ do |errorstring|
expect {
throw_an_exception!
}.to raise_error(errorstring)
end
Как сказано выше, это ужасно неправильно, поскольку схема нарушена, но она послужит цели, не так ли? ; -)
Дополнительную документацию вы найдете при ошибках тестирования при ожиданиях rspec .