2016-06-23 51 views
0

鑑於這些軌道型號:rspec的工廠女孩​​傳球協會協會

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

如果您需要一個指向特定寵物和人類的獸醫訪問,然後在您的spec文件中構建它。

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

這假設你已經創建了規範文件中的人類和寵物。

+0

事實上,在很多情況下是有意義的做這種方式。但是在更復雜的例子中,這可能意味着要定義數百個並將它們傳遞給它們。然後,你可以堅持導入YAML結構,但爲了擁有完整的自包含工廠,我正在尋找是否有辦法在FactoryGirl – xxjjnn

+0

中做到這一點,人們可能會想知道爲什麼在測試中需要100個。如果你的測試需要那麼多,那麼或許你的測試需要被重構。如果你的測試概念與你說的6個比較,你的測試概念有什麼不同?如果你需要'數百'的比你最有可能編寫一個循環來做這樣的事情,但我不明白爲什麼一個spec文件需要100個像那樣定義的變量。 – MageeWorld