2014-06-29 210 views
2
redirect_to browse_path(asset.parent_id), notice: "successfully created file!", status: 201 

201是应该在创建资源时设置的状态。虽然上述方法适用于创建操作,其行为规范不再做:设置http状态代码

subject { response } 
describe '.create' do 
    context 'when orphan' do 
     before do 
     post :create, asset: { parent_id: nil, uploaded_file: file } 
     end 

     it { should have_http_status 201 } 
     it { should redirect_to '/' } 
    end 
end 

状态期望通过,但redirect_to的期望失败:

Expected response to be a <redirect>, but was <201> 

我承认,它不再一个302重定向,但它仍然将用户重定向到一个新的路由(我想测试)。该redirect_to的规范通过,如果我将它设置为302的“错误”的代码,而不是201:

redirect_to browse_path(asset.parent_id), notice: "successfully created file!", status: 302 

所以我应该与设置状态代码烦恼呢?我承认我实际上并不知道浏览器如何使用它们,并且我的应用程序的功能同样如此,如果我刻意将它们设置在我的操作中或不这样做(仅使用302重定向和200次成功)。

如果状态码很重要,应该如何让我的上述规格通过?

+0

我得到'错误数量的参数(2为1)'? – Starkers

回答

0

您可以在rspec中声明response.body或其他响应属性。在这种情况下,你后面的东西是response.header["Location"]

你可以选择避开capybara/rspec的问题,在那里你可以声明current_url并仍然声明状态码。

redirect_to只是一个愚蠢的中级帮手,你需要达到一个略低的水平在response.something或更高水平与水豚才能得到你想要的位置。

+0

虽然我可以做到这一点,它的(:状态){应该公式201},我不能做它的(:路径){应该eq'/'}​​'。路径不是响应对象的方法。我试过检查它,但找不到我想要的...任何想法? – Starkers

+1

response.header [“Location”]是重定向的位置。 – BookOfGreg

0

的一种方法是这样的:

its(:status){ should eq 201 } 
its(:location){ should eq 'http://test.host/' } 
1

docs

状态代码可以是一个标准的HTTP状态代码作为 整数或符号表示downcased,强调和 象征性的描述。请注意,状态码必须是3xx HTTP 代码,否则不会发生重定向。

(强调)

简单地说,它是用201个的状态码来重定向一个错误。

+0

谢谢,注意。我需要更多地研究http代码... – Starkers