如何在rspec中测试redirect_to :back
?
我得到了
ActionController::RedirectBackError
:
在此操作的请求中未设置HTTP_REFERER
,因此无法成功调用redirect_to :back
。如果这是一项测试,请务必指定request.env["HTTP_REFERER"]
。
如何在我的测试中设置HTTP_REFERER
?
答案 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,您可以改为使用期望:
expect(response).to redirect_to :back
答案 5 :(得分:-1)
request.env['HTTP_REFERER'] = '/your_referring_url'