Уважаемые коллеги Переполнения,Как проверить полиморфные контроллеры в Rails 2.3?
Я постараюсь дать суть моей проблемы. Заранее благодарю за ваше терпение.
Мой Полиморфные контроллер (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
На моем 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'
EDIT:
Соответствующая часть в тестах:
test/functional/appointments_controller_test.rb
require 'test_helper'
class AppointmentsControllerTest < ActionController::TestCase
fixtures :patients, :appointments, :doctors, :users
# The following passes:
def setup
login_as :admin
end
test "should show patient appointment" do
get :show, :id => 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 < ActionController::TestCase
fixtures :patients, :appointments, :doctors, :users
# The following passes:
def setup
login_as :admin
end
test "should show doctor appointment" do
get :show, :id => 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'
На данный момент, я добавил @controller = AppointmentsController.new
по методу setup
, только чтобы получить очень знакомым:
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'
Мне кажется, как замкнутый круг.
EDIT END
Так, так как тест не может найти контроллер, так как его точки маршрута в admin/appointments
- почему я в состоянии оказать
/admin/doctors/1/appointments
сappointments_controller.rb
не живет ни подAdmin
папку, ниAdmin::
namespace (но там точки маршрута) и - Какова наилучшая стратегия для написания функциональных тестов для этого случая?
Заранее благодарю вас!
рк
запустите команду 'gem install rails -v 4.0.0', а затем повторите попытку. = D – OneChillDude
Итак, решает ли Rails 4.0.0 проблему? – Cacofonix
Ну, я не знаю много о полиморфных контроллерах в rails 2.3.18, чтобы помочь и, к сожалению, с этой версией рельсов, некоторые из младших программистов, таких как я, даже не программировали, когда они были текущими. Трудно найти поддержку для таких старых версий, и если вы можете обновить, я бы порекомендовал ее. – OneChillDude