factory_girlを試してみた(基礎編)

今日はfactory_girlを紹介します。たぶん、1回では終わらないので今日は基礎編ということで。

使用したバージョンなど

今回使用したバージョンは

  • factory_girl_rails 3.0.0
  • factory_girl 3.0.0

を使用しています。

インストール

インストールは、Gemfileに次の1行を書くだけです。

gem "factory_girl_rails", "~> 3.0"

前提モデルなど

factory_girlを使うために、Railsアプリケーションとしてモデルを作成しておきます。

rails g scaffold User name:string email:string
rails g scaffold Post title:string body:text user:references
rake db:migrate
rake db:migrate test

factory_girlにおけるデータの定義

factory_girlをインストールしていると、scaffoldしたらfactoriesディレクトリの下に次のようなテンプレートが作成されます。

FactoryGirl.define do
  factory :user do
    name "MyString"
    email "MyString"
  end
end

MyStringと書かれた部分を修正すればOKです。

factoryと書かれた行のシンボルは作成するデータを特定する名前になります。この名前を変えれば、それぞれ個別のデータを作成することができます。ただし、シンボルから作成するモデルが特定できない場合(classifyした結果のモデルが存在しない場合?)はclassで作成するモデルを作成する必要があります。

FactoryGirl.define do
  factory :user do
    name "User1"
    email "hoge@example.com"
  end
  factory :user2, :class => User do
    name "User2"
    email "user2@example.com"
  end
end

実際に作ってみましょう。FactoryGirl.build(名前)でデータが作成されます。

tsubame.local{miyohide}% rails c test
Loading test environment (Rails 3.2.2)
irb(main):001:0> FactoryGirl.create(:user)
   (0.1ms)  begin transaction
  SQL (21.0ms)  INSERT INTO "users" ("created_at", "email", "name", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Sat, 28 Apr 2012 11:50:51 UTC +00:00], ["email", "hoge@example.com"], ["name", "User1"], ["updated_at", Sat, 28 Apr 2012 11:50:51 UTC +00:00]]
   (1.2ms)  commit transaction
=> #<User id: 1, name: "User1", email: "hoge@example.com", created_at: "2012-04-28 11:50:51", updated_at: "2012-04-28 11:50:51">
irb(main):002:0> FactoryGirl.create(:user2)
   (0.1ms)  begin transaction
  SQL (22.0ms)  INSERT INTO "users" ("created_at", "email", "name", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Sat, 28 Apr 2012 11:56:52 UTC +00:00], ["email", "user2@example.com"], ["name", "User2"], ["updated_at", Sat, 28 Apr 2012 11:56:52 UTC +00:00]]
   (4.0ms)  commit transaction
=> #<User id: 2, name: "User2", email: "user2@example.com", created_at: "2012-04-28 11:56:52", updated_at: "2012-04-28 11:56:52"> 

とりあえず、今日はここまでで。