読者です 読者をやめる 読者になる 読者になる

FactoryGirlのassociationをつけなくてもモデル間を関連づけする方法

rspec

FactoryGirlでモデルの関連づけをする場合は、associationを使ったりします。

ただし、なんでもassociationを使うと、テストが多くなるにつれて、テストが壊れやすくなります。

関連づけをする書き方は他にもあります。

associationのあり/なしの書き方を見せます。

書き方

まずは下記のようなモデルがあったとします。

class Contact < ActiveRecord::Base
  has_many :phones
end

class Phone < ActiveRecord::Base
  belongs_to :contact
end

associationで書く場合 /spec/factory/

FactoryGirl.define do
  factory :contact do
    firstname 'John'
    lastname 'Doe'
    sequence(:email) { |n| "johndoe#{n}@example.com" }
  end
end

FactoryGirl.define do
  factory :phone do
    association :contact
    phone '123-555-1234'
    phone_type 'home'
  end
end

/spec/models/

  it "allows two contacts to share a phone number" do
    create(:phone)
  end

pry(#<RSpec::ExampleGroups::Phone>)> Phone.all
=> [#<Phone id: 1, contact_id: 1, phone: "123-555-1234", phone_type: "home", created_at: "2016-05-15 09:42:44", updated_at: "2016-05-15 09:42:44">]

関連づけされています。

associationなしの場合 /spec/factory/

FactoryGirl.define do
  factory :contact do
    firstname 'John'
    lastname 'Doe'
    sequence(:email) { |n| "johndoe#{n}@example.com" }
  end
end

FactoryGirl.define do
  factory :phone do
    phone '123-555-1234'
    phone_type 'home'
  end
end

/spec/models/

  it "allows two contacts to share a phone number" do
    contact = create(:contact)
    create(:phone, contact: contact)
  end

→=>pry(#<RSpec::ExampleGroups::Phone>)> Phone.all
=> [#<Phone id: 1, contact_id: 1, phone: "123-555-1234", phone_type: "home", created_at: "2016-05-15 09:41:04", updated_at: "2016-05-15 09:41:04">]

無事に関連づけが行われています。

まとめ

無理してassociationを書かなくても大丈夫です。