Спекуляция запроса работает как ожидалось;Спецификация контроллера позволяет: публиковать, когда это не должно - PullRequest
2 голосов
/ 08 марта 2011

Почему эта спецификация запроса работает так, как должна:

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

ОБНОВЛЕНИЕ: добавлен код для контроллера Applicants и определение маршрута:

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 становятся просто описательными.

Может ли кто-нибудь подтвердить, что это умышленно? Или я должен подать отчет об ошибке?

Спасибо!

1 Ответ

3 голосов
/ 08 марта 2011

Это кажется удивительным, но это имеет смысл, когда вы смотрите на это с точки зрения тестирования действий контроллера в изоляции. Обычно действия контроллера не должны знать о методах HTTP-запроса. Указание маршрута без метода иллюстрирует это:

  match 'sample' => 'applicants#index'

Теперь GET /sample и POST /sample будут маршрутизировать действие index. Если вы не укажете код, контроллер не будет знать разницу между запросом 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
...