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

Да, это так просто!:)