如何在Rails 2.3中测试多态控制器?

亲爱的花花公子,

我会尽力说明问题的实质。 提前感谢您的耐心等待。

My Polymorphic Controller( Appointments )由两个Views ,第一个属于Admin::Doctor命名空间,第二个属于Patient命名空间。

routes.rb的相关部分:

 map.resources :patient do |patients| patients.resources :appointments end map.namespace(:admin) do |admin| admin.resources :doctor do |doctors| doctors.resources :appointments end end 

所以,我现在可以得到:

 patients/:patient_id/appointments admin/doctors/:doctor_id/appointments 

……和实际路线:

rake routes | grep appointment

  new_patient_appointments GET /patients/:patient_id/appointments/new(.:format) {:controller=>"appointments", :action=>"new"} edit_patient_appointments GET /patients/:patient_id/appointments/edit(.:format) {:controller=>"appointments", :action=>"edit"} patient_appointments GET /patients/:patient_id/appointments(.:format) {:controller=>"appointments", :action=>"show"} PUT /patients/:patient_id/appointments(.:format) {:controller=>"appointments", :action=>"update"} DELETE /patients/:patient_id/appointments(.:format) {:controller=>"appointments", :action=>"destroy"} POST /patients/:patient_id/appointments(.:format) {:controller=>"appointments", :action=>"create"} new_admin_doctor_appointments GET /admin/doctors/:doctor_id/appointments/new(.:format) {:controller=>"admin/appointments", :action=>"new"} edit_admin_doctor_appointments GET /admin/doctors/:doctor_id/appointments/edit(.:format){:controller=>"admin/appointments", :action=>"edit"} admin_doctor_appointments GET /admin/doctors/:doctor_id/appointments(.:format) {:controller=>"admin/appointments", :action=>"show"} PUT /admin/doctors/:doctor_id/appointments(.:format) {:controller=>"admin/appointments", :action=>"update"} DELETE /admin/doctors/:doctor_id/appointments(.:format) {:controller=>"admin/appointments", :action=>"destroy"} POST /admin/doctors/:doctor_id/appointments(.:format) {:controller=>"admin/appointments", :action=>"create"} 

我的模特:

 class Patient has_many :appointments, :as => :attendee end class Doctor has_many :appointments, :as => :attendee end class Appointment belongs_to :attendee, :polymorphic => true end 

我的控制器:

Controllers/Admin/doctors_controller.rb

 class Admin::DoctorsController < AuthorisedController end 

Controllers/appointments_controller.rb

 class AppointmentsController < ApplicationController end 

Controllers/patients_controller.rb

 class PatientsController < ApplicationController end 

在我的test/functional/appointments_controller_test.rb ,我正在测试patients没有错误,但在测试doctors ,我得到一个ActionController::RoutingError

 4) Error: test_should_show_doctor_appointment(AppointmentsControllerTest): ActionController::RoutingError: No route matches {:controller=>"appointments", :id=>"281110143", :action=>"show", :doctor_id=>2} test/functional/appointments_controller_test.rb:55:in `test_should_show_doctor_appointment' 

编辑:

测试中的相关部分:

test/functional/appointments_controller_test.rb

 require 'test_helper' class AppointmentsControllerTest  patients(:one).to_param, :appointment_id => appointments(:app_one).id assert_response :success end # The following fails, giving the error mentioned above: test "should show doctor appointment" do get :show, :id => doctors(:one).to_param, :appointment_id => appointments(:app_one).id assert_response :success end end 

正如@Ryan指出的那样,测试位于基本命名空间下,因此下一步,我在Admin下创建了一个测试。

test/functional/admin/appointments_controller_test.rb

 class Admin::AppointmentsControllerTest  doctors(:one).to_param, :appointment_id => appointments(:app_one).id assert_response :success end end 

…现在我收到此错误:

  1) Error: test_should_show_doctor_appointment(Admin::AppointmentsControllerTest): RuntimeError: @controller is nil: make sure you set it in your test's setup method. test/functional/admin/appointments_controller_test.rb:13:in `test_should_show_doctor_appointment' 

此时,我在setup方法下添加了@controller = AppointmentsController.new ,只是为了得到非常熟悉的:

 1) Error: test_should_show_doctor_appointments(Admin::AppointmentsControllerTest): ActionController::RoutingError: No route matches {:action=>"show", :controller=>"appointments", :doctor_id=>2, :id=>"281110143"} test/functional/admin/appointments_controller_test.rb:14:in `test_should_show_doctor_appointments' 

在我看来,这似乎是一个恶性循环。

编辑结束

因此,由于测试无法找到控制器,因为其路径指向admin/appointments

  • 为什么我能够渲染/admin/doctors/1/appointments因为appointments_controller.rb既没有在Admin文件夹下也没有Admin:: namespace(但路由指向那里)和
  • 为该案例编写function测试的最佳策略是什么?

先感谢您!

的pR

这个错误:

 ActionController::RoutingError: No route matches {:controller=>"appointments", :id=>"281110143", :action=>"show", :doctor_id=>2} 

显示您正在向名为AppointmentsController的控制器发出请求,但是根据您的路线判断:

 new_admin_doctor_appointments GET /admin/doctors/:doctor_id/appointments/new(.:format) {:controller=>"admin/appointments", :action=>"new"} edit_admin_doctor_appointments GET /admin/doctors/:doctor_id/appointments/edit(.:format){:controller=>"admin/appointments", :action=>"edit"} admin_doctor_appointments GET /admin/doctors/:doctor_id/appointments(.:format) {:controller=>"admin/appointments", :action=>"show"} PUT /admin/doctors/:doctor_id/appointments(.:format) {:controller=>"admin/appointments", :action=>"update"} DELETE /admin/doctors/:doctor_id/appointments(.:format) {:controller=>"admin/appointments", :action=>"destroy"} POST /admin/doctors/:doctor_id/appointments(.:format) {:controller=>"admin/appointments", :action=>"create"} 

该路由仅在admin命名空间内可用,即Admin::AppointmentsController

我敢打赌,你正在做类似describe AppointmentsController事情,而不是describe Admin::AppointmentsController 。 我不确定,因为你没有包括测试本身的关键部分。