Как проверить ассоциацию полиморфа c с FactoryBot на Rails 5.2? - PullRequest
0 голосов
/ 14 января 2020

Я пишу базовые c тесты, чтобы определить проверки, сделанные на уровне моделей. Я использую Rspe c и FactoryBot. Модель BusinessObject может иметь 2 родителей: либо BusinessArea, либо BusinessProcess.

Извлечение модели BusinessObject:

# == Schema Information
#
# Table name: business_objects
#
#  id                 :integer          not null, primary key
#  playground_id      :integer          not null
#  main_scope_id      :integer
#  code               :string(30)       not null
#  name               :string(200)      not null
#  description        :text
#  area_process_type  :string
#  area_process_id    :integer

class BusinessObject < ActiveRecord::Base
  belongs_to :area_process, polymorphic: true
  validates :area_process, presence: true
...
end

Извлечение модели BusinessArea:

class BusinessArea < ActiveRecord::Base
  has_many :business_objects, as: :area_process
...
end

Извлечение модели BusinessProcess:

class BusinessProcess < ActiveRecord::Base
  has_many :business_objects, as: :area_process
...
end

Фабрика:

FactoryBot.define do
  factory :business_object do
    association :area_process,  factory: :business_area
    name                {"Test Business Object"}
    code                {"TEST_BO"}
    description         {"This is a test Business object used for unit testing"}
    created_by          {"Fred"}
    updated_by          {"Fred"}
    owner_id            {1}
    status_id           {0}
    end

end

При запуске тестов Фабрика завершается ошибкой со следующим сообщением:

7 ) BusinessObject имеет действительную фабрику Сбой / Ошибка: ожидаемо (build (: business_object)). To be_valid

 ActiveRecord::StatementInvalid:
   PG::UndefinedColumn: ERROR:  Column business_objects.business_area_id does not exist.

Как указать фабрике родительский элемент для использования в ассоциации?

Большое спасибо!

1 Ответ

0 голосов
/ 23 января 2020

Я нашел решение как декларацию подфабрики, благодаря Фабричная таблица Bot Bot .

Я должен указать родительский объект бизнес-объекта при определении фабрики:

FactoryBot.define do
  factory :business_object, parent: :business_area do
    playground_id       {0}
    name                {"Test Business Object"}
    code                {"TEST_BO"}
    description         {"This is a test Business object used for unit testing"}
    created_by          {"Fred"}
    updated_by          {"Fred"}
    owner_id            {1}
    status_id           {0}
  end
end

Затем фабрика ссылается на требуемого родителя при создании тестируемого бизнес-объекта.

РЕДАКТИРОВАТЬ: в некоторых условиях этого оказалось недостаточно, поэтому мне пришлось быть более явным :

FactoryBot.define do
  factory :business_object do
    association :parent, factory: :business_area, strategy: :build
    playground_id       {0}
    name                {"Test Business Object"}
    code                {"TEST_BO"}
    description         {"This is a test Business object used for unit testing"}
    created_by          {"Fred"}
    updated_by          {"Fred"}
    owner_id            {1}
    status_id           {0}
  end
end
...