【问题标题】:Rails FactoryGirl - Create specific factories in order to meet fk dependanciesRails Factory Girl - 创建特定的工厂以满足 fk 依赖
【发布时间】:2016-12-14 11:48:11
【问题描述】:

工厂在/factories/ 下的多个文件或factories.rb 文件中定义

spec/factories/*.rb
spec/factories.rb

模型客户测试需要customer工厂。这个工厂有一个指向address 工厂的外键。

  • 地址工厂定义在/spec/factories.rb
  • 客户工厂定义在spec/factories/customer.rb

现在如果我运行

rspec spec/model/customer_spec.rb

我收到以下错误

postgresql_adapter.rb:602:in `exec_prepared': PG::ForeignKeyViolation:
ERROR:  insert or update on table "customers" violates foreign key constraint "fk_rails_580b7e1bd8" (ActiveRecord::InvalidForeignKey)
DETAIL:  Key (address_id)=(1) is not present in table "addresses".
: INSERT INTO "customers" ("date_of_birth", "created_at", "updated_at", , "female_household_members", "male_household_members", "pin_code", "national_id", ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING "id"

FactoryGril 尝试先建立客户工厂,但由于地址表中缺少条目而失败。

如何避免这些依赖问题?我可以以某种方式定义先建立一些基本工厂吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rspec factory-bot


    【解决方案1】:

    我真的会保持一致,并为每个工厂(模型)使用一个文件以保持一致性。不要让别人挖坑。

    # spec/factories/addresses.rb
    FactoryGirl.define do
      factory :address do
        # ...
      end
    end
    
    # spec/factories/customers.rb
    FactoryGirl.define do
      factory :customer do
        association :address
        # or the short form
        address
      end
    end
    

    您需要做的就是参考客户的address 工厂。和factory_girl will create the associated record

    【讨论】:

    • 是的,当然就是这样。我确实设置了 fk 来修复快速测试的值 -.- ...当然它最终是这样 :) 每个工厂的一个文件是一个很好的提示 btw!
    【解决方案2】:

    您是否尝试将association :address 添加到customer 工厂?如果您展示您的 customeraddress 工厂,会更容易提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多