単一テーブル継承 を利用している以下のような Model が存在しているとします。
app/models/user.rb
class User < ActiveRecord::Base
end
app/models/girl.rb
class Girl < User
end
app/models/boy.rb
class Boy < User
end
この場合 FactoryGirl は以下のように定義します。
spec/factories/users.rb
FactoryGirl.define do
factory :user do
name 'Anonymous'
age 18
end
end
spec/factories/girls.rb
FactoryGirl.define do
factory :girl, parent: :user, class: 'Girl'
end
spec/factories/boys.rb
FactoryGirl.define do
factory :boy, parent: :user, class: 'Boy'
end
これでサブクラスのオブジェクトを正しく生成できます!
FactoryGirl.build(:girl, name: '戦場ヶ原ひたぎ')
#=> #<Girl:0x00000000000000 name: "戦場ヶ原ひたぎ", age: 18, type: "Girl">
ポイントは以下の 2 つです。
- サブクラスの factory の parent オプションでスーパークラスの factory を指定すること。
- サブクラスの factory の class オプションで自身の class を指定すること。
- これがないと Factory.build(:girl) や Factory.create(:girl) の返り値がスーパークラスの型 (この例では User 型) になってしまいます。