gpt4 book ai didi

ruby-on-rails - 请求规范按预期工作; Controller 规范允许 :post when it shouldn't

转载 作者:行者123 更新时间:2023-12-04 06:32:32 25 4
gpt4 key购买 nike

为什么这个请求规范可以正常工作:

require "spec_helper"

describe "POST on a GET route" do
it "should not allow this" do
post "/applicants/new"
assert_response :missing
end
end

但是在这个 Controller 规范中,GET、POST、PUT 和 DELETE 在不应该时都以相同的方式工作:
require 'spec_helper'

describe ApplicantsController do
it "should not allow this" do
post :new
should respond_with :missing # but it responds with 200
end
end

更新:添加了 ApplicantController 代码和路由定义:
class ApplicantsController < InheritedResources::Base    
respond_to :html
actions :index, :new, :create

def new
if current_user
redirect_to resume_application_path and return
end

@applicant = Applicant.new
@applicant.applications.build
@applicant.build_user_detail
new!
end
end

路线:
resources :applicants

更新 :经过对 API 的大量研究和挖掘,我相信这是设计使然,因为 Controller 规范继承自 ActionController::TestCase,而请求规范继承自 ActionDispatch::IntegrationTest。在 Controller 规范的情况下,HTTP 动词变得仅仅是描述性的。

有人可以确认这是设计使然吗?或者我应该提交错误报告?

谢谢!

最佳答案

这似乎令人惊讶,但是当您从单独测试 Controller 操作的角度来看时,这是有道理的。通常, Controller 操作不需要知道 HTTP 请求方法。在没有方法的情况下指定路由说明了这一点:

  match 'sample' => 'applicants#index'

现在 GET /samplePOST /sample都将路由到索引操作。除非您为它编码,否则 Controller 不会知道 GET 和 POST 请求之间的区别。 Controller 规范不测试请求方法/操作组合是否可路由,因为这是路由引擎的责任。

您可以使用路由规范验证哪些路由有效,哪些无效:
it "recognizes and generates #new" do
{ :get => "/applicants/new" }.should route_to(:controller => "applicants",
:action => "new")
end

it "does not recognize POST /applicants/new" do
{ :post => "/applicants/new" }.should_not be_routable
end

关于ruby-on-rails - 请求规范按预期工作; Controller 规范允许 :post when it shouldn't,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5227999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com