设置http状态代码

时间:2014-06-29 18:40:28

标签: ruby-on-rails rspec

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

201是您创建资源时应设置的状态。虽然上述方法适用于创建操作,但其操作规范不再适用:

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重定向,但它仍然将用户重定向到新路由(我想测试)。如果我将它设置为302的“错误”代码而不是201:

,则redirect_to规范会通过
redirect_to browse_path(asset.parent_id), notice: "successfully created file!", status: 302

所以我应该为设置状态代码而烦恼吗?我承认我实际上不知道浏览器如何使用它们,我的应用程序也可以正常运行,如果我在我的行动中精心设置它们或者不使用它们(仅使用302重定向和200次成功)。

如果状态代码很重要,我应该如何通过上述规范?

3 个答案:

答案 0 :(得分:1)

来自docs

  

状态代码可以是标准的HTTP状态代码   整数,或代表下行的符号,下划线和   象征性的描述。请注意,状态代码必须是3xx HTTP   代码或重定向不会发生。

(强调补充)

简单地说,使用201状态代码重定向是错误的。

答案 1 :(得分:0)

您可以在rspec中断言response.body或其他响应属性。在这种情况下,您所追求的是response.header["Location"]

您可以选择使用capybara / rspec来解决问题,您可以断言current_url并仍然断言状态代码。

redirect_to只是一个愚蠢的中级助手,你需要达到稍微低一级的响应级别或更高级别的水豚以获得你想要的位置。

答案 2 :(得分:0)

一种方法是:

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