如何在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
。 我不确定,因为你没有包括测试本身的关键部分。