2009-11-19 52 views
13

Với tôi có một con đường mang tên:Làm thế nào để sử dụng rspec để kiểm tra các tuyến đường được đặt tên?

map.some_route '/some_routes/:id', :controller => 'some', :action => 'other' 

Làm thế nào để sử dụng định tuyến đặc tả tập tin 'đặc tả/định tuyến/some_routing_spec.rb' để kiểm tra cho rằng tuyến đường được đặt tên?

Tôi đã thử này sau khi "mô tả SomeRouteController" khối và nó không hoạt động, tôi nhận được 'phương pháp xác định 'helper':

describe SomeRouteHelper, 'some routes named routes' do 
    it 'should recognize some_route' do 
    helper.some_route_path(23).should == '/some_routes/23' 
    end 
end 

Trả lời

13

Nếu điều này nằm trong thông số bộ điều khiển, bạn có thể gọi trực tiếp phương thức định tuyến, không cần trợ giúp.

describe SomeController do 
    it 'should recognize ma routes!' do 
    thing_path(23).should == '/things/23' 
    end 
end 
+1

Cảm ơn, tôi đã cố gắng điều đó, chỉ muốn nghe người khác nói rằng tôi không điên, hehe ... Hóa ra tôi đã sử dụng tài nguyên lồng nhau, yêu cầu định dạng parent_child_path (23) trái ngược với child_path (23) định dạng. – btelles

+0

Mọi thứ thay đổi nhanh chóng trong RSpec - dchelimsky gợi ý sử dụng route_to matcher: Route_to matcher xác định rằng một yêu cầu (verb + uri) có thể định tuyến được. Nó có giá trị nhất khi chỉ định các tuyến khác với các tuyến RESTful chuẩn. https://www.relishapp.com/rspec/rspec-rails/v/2-4/docs/routing-specs/route-to-matcher (xem thêm câu trả lời của Scarver cho câu hỏi này) –

2

Bạn có thể làm điều này trong thông số kỹ thuật điều khiển của bạn với assert_routing , như vậy:

describe UsersController do 
    it "should recognize a specific users#show route" do 
    assert_routing("https://stackoverflow.com/users/23", {:controller => "users", :action => "show", :id => 23}) 
    end 
end 

Tài liệu khác là here.

+0

Yup, đó là để nhận dạng tuyến đường thường xuyên, mặc dù tôi đã tìm kiếm các thông số tuyến đường có tên. Cảm ơn mặc dù! – btelles

12

Trong RSpec-Rails 2.7+ bạn có thể tạo thư mục spec/routing và đặt thông số định tuyến của bạn trong đó. Xem rspec-rails docs để biết thêm thông tin.

6

có một shoulda khớp tốt đẹp cho quá này:

it { should route(:get, "https://stackoverflow.com/users/23").to(:action => "show", :id => 23) 

biết thêm thông tin về việc sử dụng shoulda quẹt với rspec:

https://github.com/thoughtbot/shoulda-matchers

1

Đây là cách tôi viết các thông số kỹ thuật sử dụng RSpec2, shoulda, và Capybara. Bạn sẽ tiết kiệm tập tin ví dụ này trong # {} Rails.root /spec/routing/thingz_routing_spec.rb hoặc tôi thích # {} Rails.root /spec/routing/thingz_controller_spec.rb

require "spec_helper" 

describe ThingzController do 
    describe "routing" do 
    it "routes to #index" do 
     get("/thingz").should route_to("thingz#index") 
    end 
    end 
end 
+0

Cú pháp thay thế: 'nên route (: get, '/thingz').to(controller:' thingz ', action:' index ') ' – scarver2

Các vấn đề liên quan