2011-08-28 4 views
7

아주 간단한 문제를 어떻게 제외하고 (나는 생각이있을 것이다),하지만 몇 가지 문제에 봉착 :레일 RSpec에 라우팅 : 조치를 테스트 : NOT 경로를

레일에서

3.1.0.rc6/RSpec에 2.6.0 나는 내 '제품의 자원의 라우팅을 테스트하기 위해 노력하고있어, 다음과 같이 라우팅 :

resources :products, :except => [:edit, :update] 

올바른 행동에 대한 라우팅이 작동하지만, 내가 편집 및 업데이트 경로 이되지 않도록하려면 호출 가능. 여기에 내가 시도하고있는 작업은 다음과 같습니다

it "does not route to #edit" do 
    lambda { get("/products/1/edit") }.should raise_error 
end 

Failure/Error: lambda { get("/products/1/edit") }.should raise_error expected Exception but nothing was raised # ./spec/routing/products_routing_spec.rb:11:in `block (3 levels) in '

... 그리고 아직, 내가

it "does not route to #edit" do 
    get("/products/1/edit").should_not route_to("products#edit", :id => "1") 
end 

을 실행할 때 나는

Failure/Error: get("/products/1/edit").should_not route_to("products#edit", :id => "1") ActionController::RoutingError: No route matches "/products/1/edit"

여기에 무슨 일이 일어나고 있는지 어떤 생각을? 나는 이것이 매우 단순해야한다고 생각하지만, 나는 그것을 이해하는 것처럼 보이지 않는다.

답변

9

람다가 실패하는 이유는 모르겠지만 rspec-rails dsl은 그런 식으로 사용하려고 생각하지 않습니다. 이런 식으로 해봤습니까?

http://relishapp.com/rspec/rspec-rails/docs/routing-specs/be-routable-matcher

{ :get => "/products/1/edit" }.should_not be_routable 

그래서 당신은 노선을하지 않는 지정할 수는 없지만, 당신은 전달되지 않음을 지정할 수 있습니다.

+0

우승자가 있습니다. 이상하게 생각합니다. 레일즈 2는 "에러 발생"람다를 다루었지만 3.1은 분명히 아닙니다. be_routable 메소드에 대해서조차 몰랐다. – PlankTon

+1

매우 유용합니다! 위의 테스트는 반드시 /spec/routing/xxxx.rb에 있어야합니다. 그렇지 않으면 오류가 발생하여 실패합니다. 예를 들어, /spec/requests/xxxx.rb 파일에는이 파일을 저장할 수 없습니다. –

0

대체 경로가 있습니까? 그 이유는 오류가 발생하지 않는 이유를 설명하기 때문에 실제로 경로가 존재하지 않기 때문에 route_to("products#edit", :id => 1)을 평가하려고 시도합니다.

+0

좋은 생각이지만 아니요. 이것은 맨 처음 프로젝트입니다. 말 그대로 오늘 오후에 시작되었습니다. 리디렉션이 설정되지 않습니다. 현재는 손자의 손이 닿지 않은 비계 자원 인 rspec & cucumber입니다. – PlankTon