определенные отношения STI терпят неудачу в FactoryBot / lint - PullRequest
0 голосов
/ 16 июня 2019

Привет, у меня есть следующие 3 модели:

Местоположение

StagingLocation <Местоположение </p>

Пакет

Я могу настроить ассоциации для создания действительной фабрики пакетов, просто вызвав фабрику StagingLocation вместо Location.Согласно следующему коду:

package_spec.rb:

  describe "package validation" do
let(:package_location) { create(:staging_location) }
it "has a valid factory" do
  expect( create(:package, location: package_location) ).to be_valid
end

Однако это не передаст FactoryBot.lint

1.lint выдает ошибку при создании Location

FactoryBot.define do
  factory :location do
  type { "StagingLocation" }
  name { "Location" + Faker::GreekPhilosophers.unique.name }    
  end
end

, выдает эту ошибку

Механизм наследования одной таблицы не смог найти подкласс: '0'.Эта ошибка возникает из-за того, что столбец type зарезервирован для хранения класса в случае наследования.Пожалуйста, переименуйте этот столбец, если вы не намеревались использовать его для хранения класса наследования, или перезапишите Location.inheritance_column, чтобы использовать другой столбец для этой информации.(ActiveRecord :: SubclassNotFound)

2.Вызов фабрики staging_location завершается с

NoMethodError

, поскольку Package ищет местоположение

FactoryBot.define do
  factory :package do
    staging_location
    name { "TEST-" + rand(99).to_s }
  end
end

Я вижу три возможных способачтобы обойти это, но не могу найти синтаксис FactoryBot для их выполнения:

a) Создайте фабрику Location

b) Создайте фабрику StagingLocation, которая возвращает класс Location с использованием base_class метод или аналогичный

c) Скажите фабрике пакетов принять staging_location в качестве фабрики местоположений

d) Игнорировать ошибку, так как в конце дня мои фабрикисоздается как ожидалось.

Есть предложения?

1 Ответ

0 голосов
/ 24 июня 2019

Согласно этой проблеме на странице FactoryBot github,

STI можно определить, объявив дочернюю фабрику в родительской фабрике и объявив класс STI.

В моем случае это сработало следующим образом:

FactoryBot.define do
  factory :location, class: "StagingLocation" do
    name { "Staging " + rand(99).to_s }    
  end
end

FactoryBot.define do
  factory :package do
    name { "Package " + rand(99).to_s }    
    location { create(:staging_location, location: location) }
  end
end
...