2013-11-18 6 views
0

Я написал этот сценарий, чтобы проверить, что, когда пользователь посещает неопубликованные записи они будут видеть страницу с ошибкой:Как проверить ошибку с огурцом?

Scenario: Unpublished entry 
    Given there is an unpublished entry 
    When a user visits the entry page 
    Then he will see an error page 

Шаги

Given /^there is (?:an|one) unpublished entry$/ do 
    @entry = create(:entry, published: false) 
end 

When /^a user visits the entry page$/ do 
    visit entry_path(@entry) 
end 

Then(/^he will see an error page$/) do 
    expect(response).to raise_error(ActiveRecord::RecordNotFound) 
end 

При выполнении теста, он не проходит мимо второго потому что он терпит неудачу с ошибкой ActiveRecord::RecordNotFound; это то, что я хочу, но это происходит на неправильном шаге.

When a user visits the entry page # features/step_definitions/entry_steps.rb:17 
    Couldn't find Entry with id=93 [WHERE "entries"."published" = 't'] (ActiveRecord::RecordNotFound) 

Очевидно, что я делаю что-то неправильно. Как написать свой сценарий, чтобы лучше выразить мое намерение, которое «посещение неопубликованной записи приведет к ошибке»?

ответ

2

У вас возникла проблема с вашим веб-приложением, если вы возвращаете ActiveRecord::RecordNotFound пользователю. Пользователи никогда не должны видеть ошибки Rails, потому что они могут предоставить им конфиденциальную информацию о вашем сервере. Плюс это просто выглядит фанки!

Вот что картина должна быть:

  1. Пользователь запрашивает несуществующий элемент
  2. Rails пытается найти недопустимый элемент и бросает ActiveRecord::RecordNotFound
  3. Rails ловит ActiveRecord::RecordNotFound и перенаправляет пользователя на страницу 404.

Затем в огурце вы проверили бы страницу 404.

Для получения более подробной информации нажмите здесь common HTML error codes.

EDIT

Вот это отличный способ, чтобы поймать ваши ActiveRecord::RecordNotFound ошибки.

class SomeModel 
    around_filter :catch_not_found 

private 
    def catch_not_found 
    yield 
    rescue 
    redirect_to not_found_url 
    end 
end 

EDIT 2

Вы можете вернуть 403 Forbidden вместо 404 Not Found

EDIT 3

Here подробное обсуждение о том, почему ловить исключения с огурцами странно. Это еще один аргумент для ловли и перенаправления.

+0

Я не согласен. Он может тестировать возможность того, что пользователь вручную вводит идентификатор записи в адресной строке. Здесь пользователь неправильно использует приложение, и разработчик не обязан защищать его от 404; он мало что может сделать, чтобы предотвратить это. Для его цели (разработчик) он хочет быть уверенным, что статья, которая не опубликована, не открывается через ручное ввод URL-адреса. – Mohamad

+0

В этом случае он должен выдать код ошибки HTML. Веб-приложение никогда не должно подвергаться исключению из мира. Вот почему есть коды ошибок HTML! – screenmutt

+0

Я склонен согласиться, но в этом конкретном случае, когда пользователь потенциально злонамерен, я не вижу вреда при отображении экрана ошибки обработки Rails, который выдает очень мало, кроме какой-либо ошибки.Переход на лишнюю милю, чтобы обеспечить обработку ошибок для ошибки, которая не должна происходить при нормальном использовании, кажется щедрой задачей для незаслуженного получателя. – Mohamad

Смежные вопросы