Rails ActiveSupport: как утверждать, что возникла ошибка? - PullRequest
46 голосов
/ 11 августа 2010

Я хочу протестировать функцию на одной из моих моделей, которая выдает конкретные ошибки.Функция выглядит примерно так:

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, но не нашел ничего перспективного.Есть идеи?

Ответы [ 2 ]

99 голосов
/ 11 августа 2010

Таким образом, юнит-тестирование на самом деле не в активной поддержке.Ruby поставляется с типичным фреймворком xunit в стандартных библиотеках (Test :: Unit в ruby ​​1.8.x, MiniTest в ruby ​​1.9), а материал в activesupport просто добавляет к нему некоторые вещи.

Если вы используетеTest :: Unit / MiniTest

assert_raise(Exception) { whatever.merge }

если вы используете rspec (к сожалению, плохо документированы, но более популярны)

lambda { whatever.merge }.should raise_error

Если вы хотите проверить повышенный Exception:

exception = assert_raises(Exception) { whatever.merge }
assert_equal( "message", exception.message )
14 голосов
/ 04 декабря 2013

Чтобы убедиться, что ни одно исключение не возникло (или не было успешно обработано), выполните в вашем тестовом примере:

assert_nothing_raised RuntimeError do
  whatever.merge
end

Чтобы проверить, возникает ли ошибка, выполните в вашем тестовом примере:

assert_raise RuntimeError do
  whatever.merge
end

Просто наперед, whatever.merge - это код, который вызывает ошибку (или нет, в зависимости от типа утверждения).

...