FactoryGirlでテスト用のデータを作成する際には、Fakerを使うとダミーデータを投入するのに非常に便利です。
例えばこんな感じ
user.rb
FactoryGirl.define do
factory :user do
email { Faker::Internet.email }
name { Faker::Name.name }
end
end
最初はこれで十分なのですが、データの数が多くなってくると、いろいろと面倒になってきます。
なにが問題か
データがFakerに完全に依存してしまいます。追加の制約ができて、Fakerだけではそれを満たせない場合、全ての箇所について手動で書きなおす必要があります。
先ほどのコードでは、名前は英語のものが入りますが、日本語の名前にしたくなった場合、Faker::Name.name
を使っている箇所をすべてFaker::NameJA.name
に書きなおさなければなりません。
解決法
FactoryGirlのsequenceを使用して、Fakerをラップします。
factories.rb
FactoryGirl.define do
sequence :name { Faker::Name.name }
sequence :email { Faker::Internet.email }
end
user.rb
FactoryGirl.define
factory :user do
email { generate :email }
name { generate :name }
end
end
このように定義しておけばFactoriGirlとFakerが粗結合になり、Fakerが生成したデータを加工したり、Fakerから別のライブラリに乗り換える際にも、sequenceの部分を書き換えるだけでよくなります。