嗨,我有以下3种型号:
位置 StagingLocation <位置 包 我可以通过简单地调用StagingLocation的工厂而不是Location来建立关联以创建有效的Package工厂。按照以下代码: package_spec.rb: 但是,这不会通过FactoryBot.lint 1。皮棉在创建位置时引发错误 引发此错误 单表继承机制无法找到子类'0'。出现此错误是因为在继承的情况下,列“类型”保留用于存储类。如果您不希望将其用于存储继承类,请重命名此列,或者覆盖Location.inheritance_column以将另一列用于该信息。 (ActiveRecord :: SubclassNotFound) 2。调用staging_location工厂失败,并显示 NoMethodError 因为Package正在寻找位置 我看到了三种可能的方法来解决这个问题,但似乎找不到能够实现它们的FactoryBot语法: a)创建位置工厂 b)创建一个StagingLocation工厂,该工厂使用base_class方法或类似方法返回Location类。
c)告诉Package工厂接受staging_location作为位置工厂 d)忽略错误,因为在一天结束时,我的工厂正在按预期方式创建。 有什么建议吗? 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.define do
factory :location do
type { "StagingLocation" }
name { "Location" + Faker::GreekPhilosophers.unique.name }
end
end
FactoryBot.define do
factory :package do
staging_location
name { "TEST-" + rand(99).to_s }
end
end
答案 0 :(得分:0)
根据this issue,在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