Как мне установить HTTP_REFERER при тестировании в Rails? - PullRequest
85 голосов
/ 12 февраля 2009

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

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 => 'invalid@abc' } }, 
  { 'referer' => '/sessions/new' } }

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

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

'/sessions/new'

Это то, что они имеют в виду?


ОК, так получается, что они имеют в виду:

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

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

Что если домен не является "localhost: 3000"? Что если это "localhost: 3001" или что-то еще? Есть ли способ предвидеть это?

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

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
  { 'referer' => '/sessions/new' } }

Документы Rails специально говорят , как вы устанавливаете заголовки.

Ответы [ 6 ]

88 голосов
/ 12 февраля 2009

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

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end
43 голосов
/ 02 сентября 2011

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

Согласно RailsGuides , вы можете передавать заголовки помощникам.

Рельсы <= 4: </h2> test "blah" do get root_path, {}, {'HTTP_REFERER' => 'http://foo.com'} ... end Рельсы> = 5:

test "blah" do
  get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
  ...
end
9 голосов
/ 02 марта 2010

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

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

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
{ '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'] работает.

1 голос
/ 21 ноября 2014

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

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

0 голосов
/ 19 октября 2016

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

post '/your-custom-route', {}, {'HTTP_REFERER': 'http://www.your-allowed-domain.com'}
0 голосов
/ 27 мая 2009
setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...