如何在不同的命名空间下测试控制器以及为什么测试失败?

亲爱的花花公子,

我使用的是Rails 2.3,我创建了一个多态控制器,可以通过属于不同命名空间的Views访问。 这是故事,感谢您提前阅读:

我有这些路线:

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"} 

……这些控制器:

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_conrtroller_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 after the code block: test "should show doctor appointment" do get :show, :id => doctors(:one).to_param, :appointment_id => appointments(:app_one).id assert_response :success end end 

错误:

 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' 

测试在基本命名空间下,所以下一步,我在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' 

这对我来说似乎是一个恶性循环。

不管怎么说,多谢拉…

的pR

你可能应该这样做:

 @controller = Admin::AppointmentsController.new 

否则,您将引用主命名空间内的控制器而不是Admin命名空间。