Тесты контроллера 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, но ни одно, похоже, не касается полиморфных вложенных ресурсов.

0 ответов

Другие вопросы по тегам