Як встановити HTTP_REFERER під час тестування в Rails?


87

Я намагаюся протестувати контролер, і я отримав цю помилку. Я розумію помилку, але не знаю, як її виправити.

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 конкретно сказано, що саме так ви встановлюєте заголовки.

Відповіді:


90

Їх рекомендація означає наступне:

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

1
Ви можете піти, просто вказавши відносний шлях, як у '/ session / new'.
Martin Faartoft

Це не працює для мене, оскільки я використовую https => 'on'. Що ж тепер робити?
Роберт Рейз

47

Прийнята відповідь не працює для тестів інтеграції, оскільки @requestзмінної не існує.

Згідно з RailsGuides , ви можете передавати заголовки помічникам.

Рейки <= 4:

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

2
Дуже дякую. Я шукав рішення 1 годину. Ваш пост працює для мене!
Роберт Рейз

9
На Rails 5 заголовки вказані, як: get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } джерело
golfadas

9

У відповідь на запитання:

Чому це не працює:

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

У Rails3 я отримав ту саму помилку:
Щоб позбутися цього у відповідному контролері, передбачено порятунок для "redirect_to: back"

Приклад:redirect_to :back rescue redirect_to required_path


0
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' } }

замість цього. І це має встановити референт


0

Найбільш прямим рішенням вищезазначеної проблеми є надсилання запиту з відповідними заголовками. Rails автоматично прочитає цей заголовок.

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

0

В даний час я використовував Rails 5.2.1, мій підхід до реферера запиту заглушки всередині контролера такий, як показано нижче:

let(:stub_referer) { some_path(some_param) }
before do
  request.headers.merge! referer: stub_referer
  get :some_action, format: :html
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.