Ruby on rails Rspec测试重定向到:返回

Ruby on rails Rspec测试重定向到:返回,ruby-on-rails,redirect,rspec,rspec2,Ruby On Rails,Redirect,Rspec,Rspec2,如何在rspec中测试重定向到:back 我明白了 ActionController::RedirectBackError: 此操作的请求中未设置HTTP\u REFERER,因此无法成功调用redirect\u to:back。如果这是一个测试,请确保指定request.env[“HTTP\u REFERER”] 如何在测试中设置HTTP\u REFERER?使用RSpec,您可以在之前的块中设置REFERER。当我试图在测试中直接设置referer时,无论我把它放在哪里,它似乎都不起作用,但

如何在rspec中测试
重定向到:back

我明白了

ActionController::RedirectBackError

此操作的请求中未设置
HTTP\u REFERER
,因此无法成功调用
redirect\u to:back
。如果这是一个测试,请确保指定
request.env[“HTTP\u REFERER”]


如何在测试中设置
HTTP\u REFERER

使用RSpec,您可以在
之前的
块中设置REFERER。当我试图在测试中直接设置referer时,无论我把它放在哪里,它似乎都不起作用,但是before块起了作用

request.env['HTTP_REFERER'] = '/your_referring_url'
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
描述BackController
关于测试:集成测试中的反向链接,我首先访问一个我认为不可能用作链接的死角页面,然后访问我正在测试的页面。所以我的代码看起来像这样

   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

但是,这确实存在一个缺陷,即如果链接确实指向死端路径,那么测试将错误地通过。

我认为接受的答案有点不正确。更好的选择是将HTTP\u 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
使用新请求样式请求请求时,从:

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
描述BackController“http://example.com/home" }
期望(响应)。将_重定向到(“http://example.com/home")
结束
结束
结束

如果有人无意中发现了这一点,并且他们正在使用
请求
规范,那么您需要明确设置您所做请求的标题。测试请求的格式取决于您使用的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

查看测试源本身可能很有用。这可能是另一个问题的症状……我可以通过首先调用“访问根路径”来缓解这个错误。但我认为我只能在集成测试中做到这一点。是吗?我发现使用:
request.env[“HTTP\u REFERER”]=“where\u I\u from”是个好主意,除非request.nil?或者request.env.nil?
是的。对我来说,它总是零,只是不起作用。在我看来,这是一个巨大的错误。自创建此答案以来,它可能已被更新以修复此问题,但我能够在测试中成功设置
request.env[“HTTP\u REFERER”]
,而无需使用
before
块。