Тест для ActiveRecord:: RecordNotFound

Мое приложение распространяет ActiveRecord:: RecordNotFound на контроллер, когда модель не может получить запись.

Вот запрос БД:

def self.select_intro_verse
  offset = rand(IntroVerse.count)
  IntroVerse.select('line_one', 'line_two', 'line_three', 'line_four', 'line_five').offset(offset).first!.as_json
end

first! вызывает a ActiveRecord::RecordNotFound, если запись не найдена, и я могу ее спасти и отобразить соответствующий шаблон в контроллере.

Это ожидаемое поведение, поэтому я бы хотел проверить его в моих спецификациях. Я написал:

context "verses missing in database" do
  it "raises an exception" do
    expect(VerseSelector.select_intro_verse).to raise_exception
  end
end

Когда я запускаю rspec:

1) VerseSelector verses missing in database raises an exception Failure/Error: expect(VerseSelector.select_intro_verse).to raise_exception ActiveRecord::RecordNotFound: ActiveRecord::RecordNotFound

Для меня тест не срабатывает, хотя исключение возникает! Как я могу пройти тест?

Ответ 1

Посмотрите в документации для rspec-expectations#expecting-errors:

expect(VerseSelector.select_intro_verse).to raise_exception

должен быть except синтаксис для исключения должен быть lambda или proc:

expect { VerseSelector.select_intro_verse }.to raise_exception(ActiveRecord::RecordNotFound)