Тесты контроллера rails для вложенных полиморфных ресурсов
Столько раз, сколько я пытался провести тестирование рельсов, вы бы подумали, что я уже понял это, а я нет.
Последний подход использует minitest - по крайней мере, это в основном Ruby, а не группа DSL, которая изучает еще один язык с помощью сотен методов. Теперь я, возможно, вырыл себя в яму с моим последним экспериментом, но мне нравится то, что я пытался выполнить. Это комбинация вложенных ресурсов, включая некоторые полиморфные ресурсы. Он также использует Pundit для авторизации.
Модели определяют иерархическую сущность (например, корпорация или государственное учреждение, такое как лесная служба или, в моем случае, иерархия VFW).
Основные моделиclass Department < ActiveRecord::Base
has_many :districts, dependent: :destroy
has_many :posts, through: :districts
has_many :reports, through: :posts
has_many :officers, as: :fillable, dependent: :destroy
has_many :markups, as: :markupable, dependent: :destroy
has_many :users, as: :loginable, dependent: :destroy
end
class District < ActiveRecord::Base
belongs_to :department
has_many :posts, dependent: :destroy
has_many :reports, through: :posts
has_many :officers, as: :fillable, dependent: :destroy
has_many :markups, as: :markupable, dependent: :destroy
has_many :users, as: :loginable, dependent: :destroy
end
class Post < ActiveRecord::Base
belongs_to :district
has_one :department, through: :district
has_many :members, dependent: :destroy
has_many :officers, as: :fillable, dependent: :destroy
has_many :reports, dependent: :destroy
has_many :markups, as: :markupable, dependent: :destroy
has_many :users, as: :loginable, dependent: :destroy
end
class User < ActiveRecord::Base
belongs_to :loginable, polymorphic: true
end
class Officer < ActiveRecord::Base
belongs_to :fillable, polymorphic: true
end
class Report < ActiveRecord::Base
belongs_to :post
end
Как и в большинстве подобных организаций, нижняя выполняет всю работу (представляет отчеты и т. Д.), А верхние уровни просто управляют, суммируют и составляют отчеты.
Это полузакрытая система, в которой вы должны войти в систему как минимум "Гость", где вы можете смотреть, но не трогать. На каждом уровне есть офицеры (сотрудники) и наценки (новости, должности и т. Д.). Пользователь - это полиморфное отношение, принадлежащее одной из сущностей (Департамент, Район или Почта).
Мои основные маршруты в основном мелкие, за исключением того, что я использую Pundit для определения объема:
resources :departments do
resources :officers,only: [:new, :create]
resources :markups,only: [:new, :create]
member do
get :reports_summary
end
end
resources :districts do
resources :officers,only: [:new, :create]
resources :markups,only: [:new, :create]
member do
get :reports_summary
end
end
resources :posts do
resources :officers,only: [:new, :create]
resources :markups,only: [:new, :create]
resources :reports,only: [:new, :create]
resources :members,only: [:new, :create]
member do
get :reports_menu
get :reports_summary
end
end
resources :officers, only: [:index, :show, :edit, :update, :destroy]
resources :markups, only: [:index, :show, :edit, :update, :destroy]
resources :reports, only: [:index, :show, :edit, :update, :destroy]
resources :members, only: [:index, :show, :edit, :update, :destroy]
Просто глядя на сотрудников почты, сгенерированные маршруты:
post_officers_path POST /posts/:post_id/officers(.:format) officers#create
new_post_officer_path GET /posts/:post_id/officers/new(.:format) officers#new
Моя проблема в том, чтобы заставить тесты контроллера работать, не тратя всю мою жизнь, чтобы это понять! Я использовал скаффолд для генерации моделей и тестов. Я начинаю переходить к той стороне, которая говорит, что тестирование контроллеров - это бесполезная трата времени и сосредоточение на интеграционных тестах. Моя основная проблема: новые и: создавать тесты для полиморфных ассоциаций, таких как офицеры. Мое старое тупое тестирование работает нормально (зная, что это не лучший подход) и все маршруты работают. Контроллер новый и создать тесты не удастся с ActionController::UrlGenerationError: No route matches {:action=>"/posts/980190962/officers/new", :controller=>"officers"}
или же No route matches {:action=>"new", :controller=>"officers"}
Даже проложить маршрут для нового почтальона с:
def test_new_post
get "/posts/#{@resource.id}/officers/new"
assert_response :success
end
выходит из строя.
Я в основном смотрел на тест контроллера, чтобы выполнить базовые функции CRUD и авторизацию, но я думаю, что проще тестировать авторизацию в интеграционном тесте, особенно если есть разные роли для выполнения разных вещей - но я должен быть в состоянии понять это, Я посмотрел на то, что кажется сотнями постов в stackru, но ни одно, похоже, не касается полиморфных вложенных ресурсов.