2013-08-12 2 views
1

Уважаемые коллеги Переполнения,Как проверить полиморфные контроллеры в 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 (но там точки маршрута) и
  • Какова наилучшая стратегия для написания функциональных тестов для этого случая?

Заранее благодарю вас!

рк

+0

запустите команду 'gem install rails -v 4.0.0', а затем повторите попытку. = D – OneChillDude

+0

Итак, решает ли Rails 4.0.0 проблему? – Cacofonix

+0

Ну, я не знаю много о полиморфных контроллерах в rails 2.3.18, чтобы помочь и, к сожалению, с этой версией рельсов, некоторые из младших программистов, таких как я, даже не программировали, когда они были текущими. Трудно найти поддержку для таких старых версий, и если вы можете обновить, я бы порекомендовал ее. – OneChillDude

ответ

1

Эта ошибка:

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. Я не знаю наверняка, потому что вы не включили критическую часть, которая является самим тестом.

+0

Эй, Райан, спасибо, что нашли время! Вы были правы в области пространства имен и пошли еще на один шаг, но я все еще получаю ошибки. Я добавил соответствующие части. – Cacofonix

+1

@Cacofonix: Пожалуйста, откройте новый вопрос для этой новой проблемы, а не измените существующий вопрос. –

+0

Это было сделано по адресу http://stackoverflow.com/questions/18208722/how-to-test-controllers-under-different-namespaces-and-why-this-test-fails – Cacofonix