2014-02-04 3 views
4

у меня есть странная проблема .. RSpec генерируется именованный menus_routing_spec.rb класса в спецификации/маршрутизацииRSpec тест маршрутизации проблемы с Params в вложенных ресурсов

тесты терпят неудачу, потому что меню является вложенным ресурс ресторана.

это мой тест:

describe MenusController do 

    before :each do 
    @restaurant = FactoryGirl.create(:random_restaurant) 
    @menu = FactoryGirl.create(:menu) 
    end 

    describe 'routing' do 
    it 'routes to #index' do 
     params = {} 
     params['restaurant_id'] = @restaurant 


     #get('/restaurants/:restaurant_id/menus').should route_to('menus#index') 
     #get(restaurant_menus_path(@restaurant)).should route_to('menus#index') 
     #get(restaurant_menus_path, { :restaurant_id => @restaurant }).should route_to('menus#index') 

     get restaurant_menus_path, { :restaurant_id => @restaurant.to_param } 
     expect(response).should route_to('menus#index') 
    end 

путь в маршрутизации рейка выглядит следующим образом:

restaurant_menus_path GET  (/:locale)/restaurants/:restaurant_id/menus(.:format) menus#index 

я получаю всегда сообщение об ошибке:

Failure/Error: get restaurant_menus_path, @restaurant.to_param 
    ActionController::UrlGenerationError: 
     No route matches {:action=>"index", :controller=>"menus"} missing required keys: [:restaurant_id] 

Я попытался также другие ... но такая же ошибка .. Кто-нибудь может увидеть, где я делаю ошибку?

это тест в спецификации/контроллеры/menus_controller_spec.rb, который работает отлично

it 'renders the index template' do 
     get :index, { :restaurant_id => @restaurant } 
     expect(response).to render_template('index') 
    end 

Большое спасибо за помощь

ответ

6

Спецификации маршрутизации должны проверить, что действие (get) задает путь в виде строки (т. «/ first/1/second/2») направится к действию с правильными параметрами (т. е. first_id: 1, id: 2)

Вам не нужно создавать экземпляр ваших моделей здесь. Это не нужно, и это просто замедлит спецификацию.

describe MenusController do 
    describe 'routing' do 
    it 'routes to #index' do 
     get('/restaurants/42/menus').should route_to('menus#index', restaurant_id: 42) 
    end 

    it 'routes to #show' do 
     get('/restaurants/42/menus/37').should route_to('menus#index', restaurant_id: 42, id: 37) 
    end 
    end 
end 

Вы также можете передать в другие аргументы, как format: :json, или что-нибудь другое, что может быть почерпнутые из строки URL, как это в основном тестировании, что ваш файл маршрутов направляет вас в нужное место с правильными параметрами.

+0

Эй, Джош, спасибо .. это, кажется, хороший способ это сделать .. намного чище .. спасибо .. – damir

0

Ок .. я решил, но я действительно не уверен, это правильный путь .. если кто-то другой способ сделать это, скажите, пожалуйста :)

это работало для меня:

it 'routes to #index with correct restaurant id' do 
     {:get => restaurant_menus_path(@restaurant)}.should route_to(:controller => 'menus', :action => 'index', :restaurant_id => @restaurant.to_param) 
end 

it 'routes not to #index with wrong restaurant id' do 
     {:get => restaurant_menus_path(@restaurant)}.should_not route_to(:controller => 'menus', :action => 'index', :restaurant_id => @restaurant1.to_param) 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^