Rspec测试redirect_to:返回

时间:2011-05-18 06:00:13

标签: ruby-on-rails redirect rspec rspec2

如何在rspec中测试redirect_to :back

我得到了

  

ActionController::RedirectBackError
  在此操作的请求中未设置HTTP_REFERER,因此无法成功调用redirect_to :back。如果这是一项测试,请务必指定request.env["HTTP_REFERER"]

如何在我的测试中设置HTTP_REFERER

6 个答案:

答案 0 :(得分:112)

使用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

答案 1 :(得分:3)

在使用新请求样式请求请求时rails guide

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

答案 2 :(得分:3)

如果有人偶然发现并且他们正在使用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

答案 3 :(得分:1)

关于测试:集成测试中的反向链接,我首先访问一个deadend页面,我认为不太可能被用作链接,然后是我正在测试的页面。所以我的代码看起来像这样

   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 :(得分:1)

恕我直言,接受的答案有点骇人听闻。更好的选择是将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 :(得分:-1)

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