FactoryGirlとFakerを粗結合にする

  • 41
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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の部分を書き換えるだけでよくなります。

参考