Rspectestingredirect_to:回来

你如何testingredirect_to :back rspec?

我明白了

ActionController::RedirectBackError
在这个动作的请求中没有设置HTTP_REFERER ,所以redirect_to :back无法成功调用。 如果这是一个testing,请确保指定request.env["HTTP_REFERER"]

如何在我的testing中设置HTTP_REFERER

使用RSpec,你可以在一个before块中设置referer。 当我试图直接在testing中设置引用者时,无论我把它放在哪里,似乎都不起作用,但是之前的块做到这一点。

 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 

当请求带有新的请求样式的请求时,从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 

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

  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,那么testing将不正确地通过。

恕我直言,接受的答案是有点哈克。 更好的select是将HTTP_REFERER设置为应用程序中的实际url,然后期望redirect:

 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 
  • redirect到一个随机的string常量感觉,如果它意外工作
  • 您可以利用rspec的内置function来精确expression您想要的内容
  • 你不会引入和重复魔术string值

对于更新版本的rspec,您可以使用期望代替:

 expect(response).to redirect_to :back 

如果有人绊倒了这一点,他们正在使用request规格,你需要明确地设置你的请求头。 testing请求的格式取决于您使用的是哪个版本的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

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