有谁知道如何让rspec遵循重定向(在控制器规范中)? (例如test / unit有follow_redirect!)
我试过“follow_redirect!”和“follow_redirect”但只得到
undefined method `follow_redirect!' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1:0xb6df5294>
例如:
创建帐户时,页面会重定向到帐户页面,我的新帐户应位于列表顶部。
it "should create an account" do
post :create, :name => "My New Account"
FOLLOW_REDIRECT!
response.code.should == "200"
accounts = assigns[:accounts]
accounts[0].name.should == "My New Account"
end
但是FOLLOW_REDIRECT!需要改为实际工作的东西。
答案 0 :(得分:65)
我认为这是rspec-rails控制器测试的默认行为,因为您可以设置对响应状态和/或路径的期望,并测试是否成功。
例如:
it "should create an account" do
post :create
response.code.should == "302"
response.should redirect_to(accounts_path)
end
答案 1 :(得分:26)
您可以使用
访问重定向位置response.headers['Location']
然后你可以直接请求。
答案 2 :(得分:19)
如果要测试重定向,则要移出rspec-rails域。
您可以使用Webrat或其他一些集成测试框架来测试它。
在不诉诸集成测试的情况下解决此问题的最简单方法可能是模拟导致重定向的方法。
答案 3 :(得分:2)
尝试使用集成/请求测试。他们通过路由到控制器使用类似Web的访问。
例如:
我在文件/spec/integration/fps_spec.rb
require 'spec_helper'
describe "FinPoradci" do
it "POST /fps.html with params" do
fp_params={:accord_id => "FP99998", :under_acc => "OM001", :first_name => "Pavel", :last_name => "Novy"}
fp_test=FinPoradce.new(fp_params)
#after create follow redirection to show
post_via_redirect "/fps", {:fp => fp_params}
response.response_code.should == 200 # => :found , not 302 :created
new_fp=assigns(:fp)
new_fp.should_not be_empty
new_fp.errors.should be_empty
flash[:error].should be_empty
flash[:notice].should_not be_empty
response.should render_template(:show)
end
end
它有效。直到你想发送标题(用于基本的http授权)。
env={'HTTP_AUTHORIZATION' => ActionController::HttpAuthentication::Basic.encode_credentials(user,password)}
post_via_redirect "/fps", {:fp => fp_params}, env
适用于create,但重定向后返回401并需要新的授权。 所以我必须在2个测试中分割它:创建和显示创建结果。
答案 4 :(得分:2)
如果你想遵循重定向使用请求规范,相当于Test :: Unit中的集成测试,那么规范就超出了范围。
在请求中,规范follow_redirect!
和Test :: Unit一样。
或者,如果您想要重定向,请使用_via_redirect
作为动词的后缀,例如:
post_via_redirect :create, user: @user
答案 5 :(得分:0)
对于RSpec / Capybara + Rails
response_headers['Location']
但只有在重定向之前没有延迟时它才有效。 如果它存在,那么就更难遵循逻辑。