2012-02-01 77 views
3

我試圖爲我的'foo'控制器設置一個成員路由,它被命名爲'bar',因此它應該只響應發佈請求。但是,我注意到在我的RSpec測試中它響應所有請求類型(GET,POST,PUT,DELETE)。Rails「POST」成員路由響應所有請求類型

我的印象是,定義路線的話,會限制它使得它將只響應POST請求:

resources :foo do 
    member do 
    post 'bar' 
    do 
end 

這似乎是由事實進一步證實,當我運行rake routes它只示出了 '酒吧' 路線如下所示:

bar_foo POST /foo/:id/bar(.:format) {:action=>"bar", :controller=>"foo"} 

然而,從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 

我在這裏錯過了些什麼?如何限制我的「酒吧」成員路線只回應「發佈」請求。

編輯:

這似乎是一個問題與任何RSpec的2.0或ActionController::TestCase,因爲我碰到下面的錯誤,當我試着打/富/:ID /條我斷絕與任何東西,但POST :

Routing Error 

No route matches [GET] "/foo/1/bar" 
+0

「把response.inspect」並檢查輸出。 – 2012-02-01 22:49:28

+0

答案是200,這就是'FooController – plainjimbo 2012-02-01 22:56:58

+0

'爲了驗證你的理智,我寫了類似的測試,依靠路由拒絕非POST等,並且已經有效,'bar'動作返回成功。這是正確的策略,必須是一些「平凡的細節」 – Woahdae 2012-02-01 23:04:23

回答

3

從我自己的經驗看來,RSpec的控制器測試將嘗試,只要路由存在強制路由行爲。 RSpec確實提供路線測試,specifically the be_routable matcher

鑑於以下route.rb片段:

post :foo, to: 'foo#create' 

看來

it "won't work as expected" do 
    get :foo 
    expect(response).to be_ok 

    post :foo 
    expect(response).to be_ok 
end 

會通過。如果路線完全從route.rb丟失,則將失敗。

以下將通過,並可以用來執行測試我們感興趣的是:

it "responds to only the proper HTTP verbs" do 
    expect(get: :foo).to_not be_routable 
    expect(post: :foo).to be_routable 
end