Как установить 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 => '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' } }
рельсы docs конкретно сказать вот как вы устанавливаете заголовки.
6 ответов:
их рекомендация переводится следующим образом:
setup do @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new' post :create, { :user => { :email => 'invalid@abc' } } end
принятый ответ не работа для интеграционных тестов, потому что
@requestпеременная не существует.По данным Рельсовые направляющие, вы можете передать заголовки помощников.
рейлинги
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
в ответ на вопрос:
почему это не работает:
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']строительство.
в 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 => 'invalid@abc' } } endв Rails 2.2.2 вышеуказанный блок никогда не выполнял фактический тест. Говоря это
пост :создать, { :пользователь => { :электронная почта => 'неверный@Азбука' } }
строка не запущена. Вы можете просто избавиться от установки блока и использовать
@request.env['HTTP_REFERER'] = 'http://test.com/sessions/new' post :create, { :user => { :email => 'invalid@abc' } }вместо. И он должен установить реферер
самое прямое решение вышеуказанной проблемы - сделать запрос с соответствующими заголовками. Rails автоматически прочитает этот заголовок.
post '/your-custom-route', {}, {'HTTP_REFERER': 'http://www.your-allowed-domain.com'}
Comments