redirect_to browse_path(asset.parent_id), notice: "successfully created file!", status: 201201是创建资源时应该设置的状态。虽然上面的方法适用于create操作,但其操作的规范不再适用于:
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次成功),我实际上不知道浏览器是如何使用它们的,我的应用程序的功能也一样好。
如果状态代码很重要,我应该如何通过我的上述规格?
发布于 2014-06-29 18:48:40
您可以在rspec中断言response.body或其他响应属性。在这种情况下,您想要的是response.header["Location"]
您可以选择避开capybara/rspec的问题,在这里您可以断言current_url并仍然断言状态代码。
redirect_to只是一个愚蠢的中级助手,你需要达到一个稍低的水平在response.something或更高的水平与水豚,以达到你想要的地方。
发布于 2014-06-30 00:17:46
来自文档
状态代码可以是作为整数的标准HTTP状态代码,也可以是表示被降大小写、强调和符号化描述的符号。注意,状态代码必须是3xx HTTP代码,否则不会发生重定向。
(强调后加)
简单地说,用201状态代码重定向是一个错误。
发布于 2014-06-29 19:17:57
一种方法是:
its(:status){ should eq 201 }
its(:location){ should eq 'http://test.host/' }https://stackoverflow.com/questions/24479071
复制相似问题