Тестирование RSpec в Rails и 304 кода состояния HTTP

#ruby-on-rails #ruby-on-rails-3 #http #http-response-codes

#ruby-on-rails #ruby-on-rails-3 #http #http-response-codes

Вопрос:

Использование Devise для аутентификации. На контроллере, который имеет:

 before_filter authenticate_user!, :except => [ :index, :show ]
  

Я всегда получаю 304 Not Modified код состояния вместо 200 OK при аутентифицированных действиях, даже в браузере при входе в систему. Представления отображаются и работают просто отлично.

Это останавливает прохождение моих тестов:

 describe 'GET index' do
  it 'should be successful' do
    get 'index'
    response.should be_success  # Fails due to 304 status code
  end
end
  

Сначала я думал, что это ошибка моего контроллера, но, кроме before_filter и decent_exposure , контроллер не мог быть более распространенным.

Что может быть причиной этой проблемы?

Комментарии:

1. 304 может быть возвращено только в ответ на условный запрос GET .

Ответ №1:

304 s — хорошая вещь. В данном случае это то, что ожидается (и желательно), даже если это может вызвать проблемы в некоторых ваших тестах. 304 Означает, что ваш веб-сервер и клиент обмениваются данными таким образом, чтобы разрешить кэширование ответа веб-сервера.

Я не совсем знаком с Rails, но я подозреваю, что существует встроенный механизм, который кэширует ваши ответы. Вот статья Rails о кэшировании:
http://guides.rubyonrails.org/caching_with_rails.html

И вот что выглядит как способ отключить кэширование на уровне контроллера / действия (игнорируйте части о iframes… также это может быть не лучшим способом):
http://arjunghosh.wordpress.com/2008/04/29/how-to-force-the-browser-to-not-cache-in-rails/

Комментарии:

1. Что сбивает с толку, так это то, что кэширование уже отключено в test среде. Если я правильно понял, любое из моих действий контроллера может вернуть этот статус, правильно? Тогда что-то еще должно быть не так…

Ответ №2:

Тесты завершились неудачей, потому что я использовал Devise для аутентификации с подтверждаемым модулем и не использовал подтвержденных пользователей.

После установки confirmed_at атрибута на заводе все тесты пройдены.