ChatGPT解决这个技术问题 Extra ChatGPT

Rspec 测试 redirect_to :back

您如何在 rspec 中测试 redirect_to :back

我明白了

ActionController::RedirectBackError: 请求中没有设置 HTTP_REFERER,因此无法成功调用 redirect_to :back。如果这是一个测试,请确保指定 request.env["HTTP_REFERER"]。

如何在我的测试中设置 HTTP_REFERER

查看测试源本身可能很有用。这可能是另一个问题的症状......
我可以通过首先调用“访问 root_path”来缓解这个错误。但我认为我只能在集成测试中做到这一点。那正确吗?

j
jrh

使用 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.env["HTTP_REFERER"] = "where_i_came_from" unless request.nil? or request.env.nil?
是的。对我来说,它总是零,它只是不工作。对我来说似乎是一个巨大的错误。
自创建此答案以来,它可能已更新以解决此问题,但我能够在我的测试中成功设置 request.env["HTTP_REFERER"] 而无需使用 before 块。
i
ivanxuu

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

s
sp89

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


n
ndnenkov

恕我直言,接受的答案有点老套。更好的选择是将 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

O
Obromios

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

   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,那么测试将错误地通过。


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