Как установить 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 конкретно сказать вот как вы устанавливаете заголовки.

593   6  

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

    Ничего не найдено.