Как вы тестируете ограничения маршрута, используя RSpec - PullRequest
5 голосов
/ 04 октября 2010

Учитывая пару городов в БД:

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

И маршрут, подобный:

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

(поэтому ограничения должны оцениваться как: / nyc | boston /)

И спецификации:

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

Я бы ожидал сбой.Но это проходит.

Аналогично:

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

Здесь я ожидаю, что оно пройдет, но это не получится.

Кажется, что ограничение игнорируется в спецификациисоответствующие города ведут себя так же, как и плохие.

Это известная проблема, или я упускаю что-то, что мне нужно сделать?

Ответы [ 2 ]

11 голосов
/ 08 октября 2010

Этот подход работает: В маршрутах .rb

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

В спецификации:

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

Наконец, я добавил наблюдателя для перезагрузки маршрутов при каждом изменении таблицы городов.

0 голосов
/ 04 октября 2010

Когда вы указываете ограничения, вы должны включить параметр для ограничения:

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