今日はfactory_girlを紹介します。たぶん、1回では終わらないので今日は基礎編ということで。
インストール
インストールは、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">
とりあえず、今日はここまでで。