Подтвердить что ты не робот

Проверка Rspec redirect_to: назад

Как вы тестируете redirect_to :back в rspec?

Я получаю

ActionController::RedirectBackError:
В запросе этого действия не было задано HTTP_REFERER, поэтому redirect_to :back нельзя было назвать успешно. Если это тест, обязательно укажите request.env["HTTP_REFERER"].

Как мне настроить HTTP_REFERER в моем тесте?

4b9b3361

Ответ 1

Используя RSpec, вы можете установить референт в блок before. Когда я попытался установить референт непосредственно в тесте, он, похоже, не работал независимо от того, где я его разместил, но перед блоком это трюк.

describe BackController < ApplicationController do
  before(:each) do
    request.env["HTTP_REFERER"] = "where_i_came_from"
  end

  describe "GET /goback" do
    it "redirects back to the referring page" do
      get 'goback'
      response.should redirect_to "where_i_came_from"
    end
  end
end

Ответ 2

Из направляющих rails при запросе запроса с новым стилем запроса:

describe BackController < ApplicationController do
  describe "GET /goback" do
    it "redirects back to the referring page" do
      get :show, 
        params: { id: 12 },
        headers: { "HTTP_REFERER" => "http://example.com/home" }
      expect(response).to redirect_to("http://example.com/home")
    end
  end
end

Ответ 3

Что касается тестирования: обратные ссылки в тестах интеграции, я сначала нахожусь на мертвой странице, что, я думаю, вряд ли когда-либо будет использоваться в качестве ссылки, а затем на странице, которую я тестирую. Таким образом, мой код выглядит следующим образом

   before(:each) do
       visit deadend_path
       visit testpage_path
    end
    it "testpage Page should have a Back button going :back" do
      response.should have_selector("a",:href => deadend_path,
                                        :content => "Back")
    end

Однако у этого есть недостаток, который, если ссылка действительно относится к deadend_path, тогда тест будет ошибочно пройден.

Ответ 4

ИМХО принятый ответ немного взломан. Лучшей альтернативой было бы установить HTTP_REFERER на фактический URL-адрес в вашем приложении, а затем ожидать перенаправления обратно:

describe BackController, type: :controller do
  before(:each) do
    request.env['HTTP_REFERER'] = root_url
  end

  it 'redirects back' do
    get :whatever
    response.should redirect_to :back
  end
end
  • Перенаправление на случайную строчную константу кажется, что она работает случайно
  • Вы используете встроенную функцию rspec, чтобы точно выразить то, что вы хотели.
  • Вы не вводите и не повторяете значения магической строки

Для более новых версий rspec вы можете вместо этого использовать ожидания:

expect(response).to redirect_to :back

Ответ 5

Если кто-то наткнется на это, и они используют спецификации request, вам нужно явно указать заголовки в запросе, который вы делаете. Формат тестового запроса зависит от того, какую версию RSpec вы используете, и если вы можете использовать аргументы ключевых слов вместо позиционных аргументов.

let(:headers){ { "HTTP_REFERER" => "/widgets" } }

it "redirects back to widgets" do 
  post "/widgets", params: {}, headers: headers # keyword (better)
  post "/widgets", {}, headers                  # positional

  expect(response).to redirect_to(widgets_path)
end

https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec

Ответ 6

request.env['HTTP_REFERER'] = '/your_referring_url'