45

有谁知道如何使 rspec 遵循重定向(在控制器规范中)?(例如测试/单元有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!需要更改为实际有效的东西。

4

6 回答 6

67

我认为这是rspec-rails控制器测试的默认行为,因为您可以对响应状态和/或路径设置期望,并测试成功。

例如:

it "should create an account" do
  post :create
  response.code.should == "302"
  response.should redirect_to(accounts_path)
end
于 2010-05-20T00:20:13.000 回答
32

您可以访问重定向位置

response.headers['Location']

然后你可以直接请求。

于 2012-09-26T13:48:21.417 回答
21

如果您想测试重定向,您将移出 rspec-rails 域。

您可以使用 Webrat 或其他一些集成测试框架来测试它。

在不诉诸集成测试的情况下解决此问题的最简单方法可能是模拟导致重定向的方法。

于 2010-05-20T13:15:29.773 回答
4

该规范超出了范围,如果您想遵循重定向使用请求规范,则相当于 Test::Unit 中的集成测试。

在请求规范follow_redirect!中和在 Test::Unit 中一样。

或者,如果您想立即重定向,请使用_via_redirect动词的后缀,例如:

post_via_redirect :create, user: @user
于 2015-06-18T03:48:15.657 回答
2

尝试使用集成/请求测试。他们通过路由到控制器使用类似网络的访问。例如:我在文件中有 Rails 2 应用程序/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

可以创建,但重定向后它返回 401 并需要新的授权。所以我必须将它分成 2 个测试:创建并显示创建结果。

于 2013-04-17T12:05:50.433 回答
0

对于 RSpec / Capybara + Rails

response_headers['Location']

但它只有在重定向之前没有延迟时才有效。如果它在那里,那么就更难遵循逻辑了。

于 2013-02-21T11:34:37.813 回答