Rails“POST”成员路由响应所有请求类型

pla*_*mbo 5 rspec routes ruby-on-rails ruby-on-rails-3

我正在尝试为我的“foo”控制器设置一个成员路由,该控制器名为“bar”,这样它应该只响应发布请求。但是,我注意到在我的 RSpec 测试中它响应所有请求类型(GET、POST、PUT、DELETE)。

我的印象是,这样定义路由会限制它,使其仅响应 POST 请求:

resources :foo do
  member do
    post 'bar'
  do
end
Run Code Online (Sandbox Code Playgroud)

rake routes当我运行它时,它仅显示“bar”路线,如下所示,这一事实似乎进一步证实了这一点:

bar_foo    POST    /foo/:id/bar(.:format)    {:action=>"bar", :controller=>"foo"}
Run Code Online (Sandbox Code Playgroud)

然而,根据 RSPEC,以下 GET、PUT 和 DELETE 测试失败(意味着控制器成功处理请求):

describe FooController do
    describe "GET bar" do
        it "should not be successful" do
            foo = FactoryGirl.create(:foo)
            get :bar, :id => foo.id
            response.should_not be_ok
        end
    end 
end
Run Code Online (Sandbox Code Playgroud)

我在这里遗漏了一些小东西吗?如何限制我的“酒吧”会员路线仅响应“发布”请求。

编辑:

这似乎是 RSpec 2.0 或ActionController::TestCase的问题,因为当我尝试使用除POST 之外的任何内容在服务器上点击/foo/:id/bar时,出现以下错误:

Routing Error

No route matches [GET] "/foo/1/bar"
Run Code Online (Sandbox Code Playgroud)

Aar*_*ron 5

根据我自己的经验,只要路由存在, RSpec 控制器测试就不会尝试强制执行路由行为。RSpec 确实提供了路由测试,特别是be_routablematcher

\n

鉴于以下route.rb片段:

\n
post :foo, to: \'foo#create\'\n
Run Code Online (Sandbox Code Playgroud)\n

它出现

\n
it "won\'t work as expected" do\n  get :foo\n  expect(response).to be_ok #=> pass\n\n  post :foo\n  expect(response).to be_ok #=> pass\nend\n
Run Code Online (Sandbox Code Playgroud)\n

将传递。只有当路由完全丢失时route.rb才会失败。

\n

以下内容将通过并可用于执行我们感兴趣的测试:

\n
it "responds to only the proper HTTP verbs" do\n  expect(get: :foo).not_to be_routable #=> pass - Cannot GET \xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f\n  expect(post: :foo).to be_routable    #=> pass - POST works \nend\n
Run Code Online (Sandbox Code Playgroud)\n