2012-02-01 2 views
3

게시물 요청에만 응답해야하는 'bar'라는 'foo'컨트롤러에 대한 회원 경로를 설정하려고합니다. 그러나 나는 RSpec 테스트에서 모든 요청 유형 (GET, POST, PUT, DELETE)에 응답한다는 것을 알았다. 나는 그래서 경로를 정의하는 것은, 그것은 같은 단지 요청을 POST에 응답 할 것을 제한 할 것이라는 인상을레일 "POST"회원 경로가 모든 요청 유형에 응답합니다.

이었다

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

이 더욱 사실에 의해 확인 보인다 나는 rake routes 그것을 ONLY을 실행할 때 '바'행과 같이 나타낸다 : RSpec에에서, 다음과 같은 시험은 GET, PUT 대 (프로세스가 성공적 요청 제어기를 의미) 실패

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

그러나 &을 삭제 :

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 

여기에 작은 것이 있습니까? "게시"요청에만 응답하도록 내 '바'회원 경로를 어떻게 제한합니까?

편집 :

이 나는 ​​다음과 같은 오류가 있기 때문에 내가 /foo는/명중 할 때, RSpec에 2.0 ActionController::TestCase 중 하나에 문제가 될 것으로 보인다

: POST 아무것도하지만 내 단절에 ID/바을 :

Routing Error 

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

"response.inspect을두고"을하고 출력을 확인합니다. –

+0

응답은 200이며, 이것은 bar 액션이 FooController – plainjimbo

+0

에서 성공했을 때 당신의 온전함을 확인하기 위해 리턴하는 것입니다. POST 이외의 것을 거부하는 비슷한 테스트를 작성하고 작동 시켰습니다. 그것은 올바른 전략이며, 평범한 세부 사항이어야합니다. – Woahdae

답변

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 
관련 문제