RSpec тестирование перенаправление:назад



как вы проверяете redirect_to :back в rspec?



Я




ActionController::RedirectBackError:

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




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

720   6  

6 ответов:

используя RSpec, вы можете установить реферер в before блок. Когда я попытался установить реферер непосредственно в тесте, он, казалось, не работал независимо от того, где я его поставил, но блок 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

Если кто-то натыкается на это, и они используют 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

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

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

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

   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, то тест будет неправильно проходить.

ИМХО принятый ответ немного хаки. Лучшей альтернативой было бы установить 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
request.env['HTTP_REFERER'] = '/your_referring_url'

Comments

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