2010-10-04 39 views
5

Cho một vài thành phố ở DB:Làm thế nào để bạn kiểm tra các ràng buộc tuyến đường sử dụng RSpec

City.first.attributes => {:id => 1, :name => 'nyc'} 
City.last.attributes => {:id => 2, :name => 'boston'} 

Và một tuyến đường như:

match '/:city/*dest' => 'cities#do_something', :constraints => {:city => /#{City.all.map{|c| c.name}.join('|'}/} 

(nên hạn chế nên đánh giá để:/nyc | boston /)

Và một spec:

it "recognizes and generates a route for city specific paths" do 
    { :put => '/bad-city/some/path' }.should route_to({:controller => "cities", :action => "do_something", :dest => 'some/path', :city => 'bad-city'}) 
end 

Tôi mong đợi một thất bại. Nhưng nó trôi qua.

Tương tự như vậy:

it "doesn't route bad city names" do 
    { :put => '/some-bad-city/some/path' }.should_not be_routable 
end 

Ở đây tôi mong đợi nó để vượt qua, nhưng nó không thành công.

Dường như ràng buộc bị bỏ qua trong thông số kỹ thuật, vì các thành phố phù hợp có hành vi tương tự như hành vi xấu.

Đây có phải là vấn đề đã biết hay tôi đang thiếu điều gì đó mà tôi cần phải làm?

+0

Bởi vì điều này làm việc trong dev, nhưng không thử nghiệm, tôi nghĩ vấn đề là ràng buộc được đánh giá lúc khởi động, và trong DB thử nghiệm không có thành phố tại điểm đó. Vì vậy, regex trông giống như // và khớp mọi thứ. Nhưng khi tôi cố gắng để làm cho nó một Proc, hoặc một lớp thực hiện #matches? (Yêu cầu) nó dường như không bao giờ được gọi. –

Trả lời

11

Cách tiếp cận này hoạt động: Trong routes.rb

match '/:city/*destination' => 'cities#myaction', :constraints => {:city => /#{City.all.map{|c|c.slug}.join('|')}/} 

Trong spec:

describe "routing" do 
    before(:each) do 
    @mock_city = mock_model(City, :id => 42, :slug => 'some-city') 
    City.stub!(:find_by_slug => @mock_city, :all => [@mock_city]) 
    MyApp::Application.reload_routes! 
    end 

    it "recognizes and generates a route for city specific paths" do 
    { :get => '/some-city/some/path' }.should route_to({:controller => "cities", :action => "myaction", :destination => 'some/path', :city => 'some-city'}) 
    end 

    it "rejects city paths for cities that don't exist in the DB" do 
    { :get => '/some-bad-city/some/path' }.should_not be_routable 
    end 
end 

Cuối cùng, tôi đã thêm một người quan sát để tải lại các tuyến đường bất cứ khi nào bảng thành phố thay đổi.

+5

Thật kinh khủng khi sử dụng một db tìm tất cả trong routes.rb như thế. Trong trường hợp này, bộ điều khiển hoặc before_filter sẽ xác thực thành phố. – oma

0

Khi bạn xác định những hạn chế, bạn phải bao gồm các tham số để hạn chế:

match '/:city/*dest' => 'cities#do_something', :constraints => { :city => /nyc|boston|philly/ } 
+0

Bạn biết đấy - trong nỗ lực của tôi để đơn giản hóa vấn đề, tôi đã giới thiệu một lỗi đánh máy. Cảm ơn cho bắt. –

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