如何在不同的命名空间下测试控制器以及为什么测试失败?
亲爱的花花公子,
我使用的是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
命名空间。