[英]Ruby on Rails 4: test nested resources with rspec not working
i have some troubles with testing my ruby on rails application. 我在rails应用程序上测试我的ruby时遇到了一些麻烦。 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.. 它是来自rspec的默认测试,但我试图修改,因为我有一个嵌套资源..
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.. 有趣的是,menu_spec.rb中的这个测试正在运行..
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.. 非常感谢你..
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. 我不得不补充:restaurant_id ..然后它起作用了。
In test type:controller
when I do get restaurant_menus_path(@restaurant)
that throws this error: 在测试type:controller
当我get restaurant_menus_path(@restaurant)
抛出此错误:
ActionController::UrlGenerationError:
No route matches {:action=>"/restaurant/1/menus", :controller=>"restaurants"}
In test type controller in the method get the first argument isn't the action in the controller: 在测试类型控制器中,方法得到的第一个参数不是控制器中的动作:
So it works with: 所以它适用于:
get :index, { :restaurant_id => @restaurant }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.