Как установить HTTP_REFERER при тестировании в Rails?

Я пытаюсь проверить контроллер, и я получил эту ошибку. Я понимаю ошибку, но не знаю, как ее исправить.

test: on CREATE to :user with completely invalid email should respond with 
  redirect
(UsersControllerTest):ActionController::RedirectBackError: 
  No HTTP_REFERER was set in the request to this action, 
  so redirect_to :back could not be called successfully. 
If this is a test, make sure to specify request.env["HTTP_REFERER"].

Укажите его где? Я пробовал это:

setup { post :create, { :user => { :email => '[email protected]' } }, 
  { 'referer' => '/sessions/new' } }

Но получил ту же ошибку.

Укажите, что именно? Я предполагаю, что URI представления я хочу, чтобы он вернулся к:

'/sessions/new'

Это то, что они означают?


ОК, так получилось, что они означают:

setup do
  @request.env['HTTP_REFERER'] = 'http://localhost:3000/sessions/new'
  post :create, { :user => { :email => '[email protected]' } }, {}
end

Может ли кто-нибудь сказать мне, где это задокументировано? Я хотел бы ознакомиться с контекстом этой информации.

Что делать, если домен не "localhost: 3000"? Что, если это "localhost: 3001" или что-то еще? Любой способ предвидеть это?

Почему это не работает:

setup { post :create, { :user => { :email => '[email protected]' } }, 
  { 'referer' => '/sessions/new' } }

В Rails docs сказать, что вы устанавливаете заголовки.

Ответ 1

Их рекомендация переводится следующим образом:

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => '[email protected]' } }
end

Ответ 2

Принятый ответ не работает для тестов интеграции, поскольку переменная @request не существует.

В соответствии с RailsGuides вы можете передать заголовки хелперам.

Для моего теста я должен был сделать это, и он отлично работал:

test "blah" do
  get root_path, {}, {'HTTP_REFERER' => 'http://foo.com'}
  ...
end

Ответ 3

В ответ на вопрос:

Почему это не работает:

setup { post :create, { :user => { :email => '[email protected]' } }, 
{ 'referer' => '/sessions/new' } }

Это не работает, потому что документ Rails, который вы связали с, документирует другой класс, чем тот, который вы, вероятно, используете.

Вы связаны с ActionController::Integration:Session. Я предполагаю, что вы пишете функциональный тест (если используете Test:: Unit) или контрольный тест (если вы используете Rspec). В любом случае вы, вероятно, используете ActionController::TestCase или его подкласс. Что, в свою очередь, включает модуль ActionController::TestProcess.

ActionController::TestProcess предоставляет метод get с различными параметрами, чем метод get, предоставляемый ActionController::Integration:Session. (Раздражающе, а?) Подпись метода такова:

 def get(action, parameters = nil, session = nil, flash = nil)

К сожалению, нет параметров заголовков. Но по крайней мере установка @request.env['HTTP_REFERER'] работает.

Ответ 4

В Rails3 я получил ту же ошибку:
Чтобы избавиться от этого в соответствующем контроллере, вы получите спасение для "redirect_to: back"

Пример: redirect_to :back rescue redirect_to required_path

Ответ 5

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => '[email protected]' } }
end

В Rails 2.2.2 вышеупомянутый блок никогда не выполнял фактического теста. Говоря, что

post: create, {: user = > {: email = > 'invalid @abc'}}

Строка

не запускалась. Вы можете просто избавиться от блока установки и использовать

@request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
post :create, { :user => { :email => '[email protected]' } }

вместо этого. И он должен установить референт

Ответ 6

Наиболее прямолинейное решение вышеперечисленной проблемы заключается в том, чтобы сделать запрос с соответствующими заголовками. Rails автоматически прочитает этот заголовок.

post '/your-custom-route', {}, {'HTTP_REFERER': 'http://www.your-allowed-domain.com'}