2

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

require "spec_helper"

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

但是在这个控制器规范中,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

更新:添加了申请人控制器代码和路由定义:

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 进行大量研究和挖掘之后,我相信这是设计使然,因为控制器规范继承自 ActionController::TestCase,而请求规范继承自 ActionDispatch::IntegrationTest。在控制器规范的情况下,HTTP 动词变得仅仅是描述性的。

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

谢谢!

4

1 回答 1

3

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

  match 'sample' => 'applicants#index'

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

您可以使用路由规范验证哪些路由有效,哪些无效:

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
于 2011-03-08T06:56:17.217 回答