Rails ActiveSupport: как утверждать, что возникает ошибка?
Я хочу проверить функцию на одной из моих моделей, которая вызывает определенные ошибки. Функция выглядит примерно так:
def merge(release_to_delete)
raise "Can't merge a release with itself!" if( self.id == release_to_delete.id )
raise "Can only merge releases by the same artist" if( self.artist != release_to_delete.artist )
#actual merge code here
end
Теперь я хочу сказать, что, когда я вызываю эту функцию с параметром, который вызывает каждое из этих исключений, что исключения действительно получаются. Я смотрел документацию ActiveSupport, но я не нашел ничего перспективного. Любые идеи?
Ответы
Ответ 1
Таким образом, модульное тестирование действительно не поддерживается активами. Ruby поставляется с типичной инфраструктурой xunit в стандартном libs (Test:: Unit в ruby 1.8.x, MiniTest в ruby 1.9), а материал в activesupport просто добавляет некоторые вещи к нему.
Если вы используете Test:: Unit/MiniTest
assert_raises(Exception) { whatever.merge }
если вы используете rspec (к сожалению, плохо документированы, но более популярны)
lambda { whatever.merge }.should raise_error
Если вы хотите проверить поднятый Exception
:
exception = assert_raises(Exception) { whatever.merge }
assert_equal( "message", exception.message )
Ответ 2
Чтобы убедиться, что исключение не было создано (или успешно обработано), выполните внутри вашего тестового примера:
assert_nothing_raised RuntimeError do
whatever.merge
end
Чтобы проверить, что ошибка возникает, выполните внутри вашего тестового примера:
assert_raise RuntimeError do
whatever.merge
end
Да, это так просто!:)