Ответ 1
Их рекомендация переводится следующим образом:
setup do
@request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
post :create, { :user => { :email => '[email protected]' } }
end
Я пытаюсь проверить контроллер, и я получил эту ошибку. Я понимаю ошибку, но не знаю, как ее исправить.
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 сказать, что вы устанавливаете заголовки.
Их рекомендация переводится следующим образом:
setup do
@request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
post :create, { :user => { :email => '[email protected]' } }
end
Принятый ответ не работает для тестов интеграции, поскольку переменная @request
не существует.
В соответствии с RailsGuides вы можете передать заголовки хелперам.
Для моего теста я должен был сделать это, и он отлично работал:
test "blah" do
get root_path, {}, {'HTTP_REFERER' => 'http://foo.com'}
...
end
В ответ на вопрос:
Почему это не работает:
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']
работает.
В Rails3 я получил ту же ошибку:
Чтобы избавиться от этого в соответствующем контроллере, вы получите спасение для "redirect_to: back"
Пример: redirect_to :back rescue redirect_to required_path
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]' } }
вместо этого. И он должен установить референт
Наиболее прямолинейное решение вышеперечисленной проблемы заключается в том, чтобы сделать запрос с соответствующими заголовками. Rails автоматически прочитает этот заголовок.
post '/your-custom-route', {}, {'HTTP_REFERER': 'http://www.your-allowed-domain.com'}