Ruby on Rails 4: test nested resources with rspec not working

mongoid, rspec, ruby-on-rails

Solution

ok, i got it, the tests should look like this:

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

i had to add :restaurant_id.. then it worked.

Problem

i have some troubles with testing my ruby on rails application. I have a resource Restaurant and a nested resource menu. Routes file: ``` resources :restaurants do resources :menus ``` Menu model: ``` class Menu include Mongoid::Document belongs_to :restaurant accepts_nested_attributes_for :restaurant validates :name, presence: true validates :description, presence: true validates :restaurant, presence: true field :name, type: String field :description, type: String end ``` restaurant model: ``` class Restaurant include Mongoid::Document has_one :address, dependent: :destroy has_many :menus, dependent: :destroy accepts_nested_attributes_for :address, :menus validates :name, presence: true validates :description, presence: true validates :address, presence: true field :name, type: String field :description, type: String field :thumbnail, type: String field :banner, type: String end ``` then, i am trying something like this. it is a default test from rspec, but which i am trying to modify because i had a nested resource.. ``` describe MenusController do before :each do @restaurant = FactoryGirl.create(:random_restaurant) @menu = FactoryGirl.create(:menu) end describe 'GET index' do it 'assigns all menus as @menus' do get restaurant_menus_path(@restaurant) assigns(:menus).should eq([menu]) end end describe 'GET all restaurants menus' do it 'responds with 200' do get :index, { :id => @restaurant } expect(response).to be_success expect(response.status).to eq(200) end end ``` but the error is: ``` 1) MenusController GET index assigns all menus as @menus Failure/Error: get restaurant_menus_path(@restaurant) ActionController::UrlGenerationError: No route matches {:controller=>"menus", :action=>"/en/restaurants/52a20e4c6561721131010000/menus"} # ./spec/controllers/menus_controller_spec.rb:30:in `block (3 levels) in <top (required)>' 2) MenusController GET all restaurants menus responds with 200 Failure/Error: get :index, { :id => @restaurant } ActionController::UrlGenerationError: No route matches {:action=>"index", :id=>"52a20e4c6561721131060000", :controller=>"menus"} # ./spec/controllers/menus_controller_spec.rb:37:in `block (3 levels) in <top (required)>' ``` here are the routes: ``` restaurant_menus_path GET (/:locale)/restaurants/:restaurant_id/menus(.:format) menus#index POST (/:locale)/restaurants/:restaurant_id/menus(.:format) menus#create new_restaurant_menu_path GET (/:locale)/restaurants/:restaurant_id/menus/new(.:format) menus#new edit_restaurant_menu_path GET (/:locale)/restaurants/:restaurant_id/menus/:id/edit(.:format) menus#edit restaurant_menu_path GET (/:locale)/restaurants/:restaurant_id/menus/:id(.:format) menus#show PATCH (/:locale)/restaurants/:restaurant_id/menus/:id(.:format) menus#update PUT (/:locale)/restaurants/:restaurant_id/menus/:id(.:format) menus#update DELETE (/:locale)/restaurants/:restaurant_id/menus/:id(.:format) menus#destroy ``` interestingly is, that this test in menu_spec.rb is working.. ``` require 'spec_helper' describe 'Menu' do before :each do @restaurant = FactoryGirl.create(:random_restaurant) @menu = FactoryGirl.create(:menu) end describe 'GET /menus' do it 'responds with 200' do get restaurant_menu_path(@restaurant, @menu) expect(response).to be_success expect(response.status).to eq(200) end end describe 'GET all restaurants menus' do it 'responds with 200' do get restaurant_menus_path(@restaurant) expect(response).to be_success expect(response.status).to eq(200) end end end ``` i really dont know why this test is not working.. :( please.. i need some explanation.. if anyone can help.. please :) resources to read are also welcome :) thank you very much..

Original source