rspec工厂女孩通过协会协会

时间:2016-06-23 13:09:05

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

鉴于这些Rails模型:

class Human
  has_many :pets
  has_many :vet_visits
end
class Pet
  belongs_to :human 
  has_many :vet_visits
end
class VetVisit
  belongs_to :human
  belongs_to :pet
end

我需要一个rspec工厂来制作VetVisit。但是:

FactoryGirl.define do
  factory :vet_visit, class: 'VetVisit' do 
    association :human, factory: :human
    association :pet, factory: :pet
  end
  factory :pet, class: 'Pet' do 
    association :human, factory: :human
  end
  factory :human, class: 'Human' do 
    after(:create) do | human |
      create :pet, human: human
    end
  end
end

导致vet_visit与人和宠物彼此不是彼此的宠物/人。

如何创建一个工厂,该工厂创建一个vet_visit,其中有一个人类的宠物与vet_visit引用的人类相同?

为了清除任何疑问,我实际上并没有制作一个vetinary系统,这是一个抽象的例子,来自一个更复杂的系统,删除了人类并且在代码中做vet_visit.pet.human是不合适的

2 个答案:

答案 0 :(得分:2)

如果您需要兽医访问,指的是特定宠物和人类,请在您的规范文件中构建它。

let(:vet_visit) { FactoryGirl.create(:vet_visit, human: human, pet: pet) }

这假设你已经在spec文件中创建了一个人类和宠物。

答案 1 :(得分:0)

我认为您需要使用inverse_of关系才能实现此目的。

创建人类时,会创建宠物。那只宠物属于人类,但人类并不了解宠物。

看看这里:http://guides.rubyonrails.org/association_basics.html#bi-directional-associations