初めまして!こんにちは!こんばんは!
もうすぐ2016年も終わりますね。
新卒エンジニアのよう太と申します。
突然ですが、皆さん
『きれいなおねえさんは、好きですか。』
私は大好きです。
かわいい女の子も好きです。
と、いうことで
今回は私が大好きな『Factory Girl』について書こうと思います。
FactoryGirlって誰?
FactoryGirlとは、テストデータの作成を手伝ってくれるgemです。
テストデータ...
それはテストコードを書く上で切っても切り離せない存在です。
自力でテストデータを用意することも可能ですが、
FactoryGirlを使用すると、複数のテストデータなどを簡単に作成することができます!
FactoryGirlのインストール
それでは、FactoryGirlをインストールしてみましょう。
インストールが無事に完了したら、Gemfileに'factory_girl_rails'を追加してください。
今回私は新規アプリを作成したので、'rspec-rails'も一緒に追加しました。
group :development, :test do
gem 'rspec-rails',
gem 'factory_girl_rails'
このままbundle installを行うと、最新バージョンがインストールされるので、
バージョンを指定したい方は
'factory_girl_rails', '~> 4.0'
このように、gemの後ろに指定したいバージョンを書いてください。
FactoryGirlと出会ってみる
ファクトリーファイルの作成
インストールが終わったら、早速ファクトリーをアプリケーションに追加してみましょう。
FactoryGirlをインストールしている状態でモデルを作成すると、
モデルと一緒にファクトリーも作成されます。
$ rails g model Blog title:string word:text writer:string
Running via Spring preloader in process 7449
invoke active_record
create db/migrate/2016**********_create_blogs.rb
create app/models/blog.rb
invoke rspec
create spec/models/blog_spec.rb
invoke factory_girl
create spec/factories/blogs.rb
既にアプリケーションをお持ちの方は、
specディレクトリの配下にfactoriesディレクトリを作成し、
モデル名.rb
上記のようなファイル名を作ってください。
デフォルトのテストデータ
ファクトリーファイルの作成ができたら、テストデータを作成してみましょう。
先ほど rails gコマンドでBlogモデルを作成したので、
spec/factories/blogs.rbで定義しようと思います。
モデルと一緒に作成されたspec/factories/blogs.rbを見てみると、
下記のようなテストデータが自動的に作成されています。
FactoryGirl.define do
factory :blog do
title "MyString"
word "MyText"
writer "MyString"
end
end
せっかくテストデータを用意してくれたので、
テストを実行するとどのようなデータができるのか試してみます。
#適当を極めたテストコードなので、良い子プログラマーは真似しないでくださいね!
require 'rails_helper'
RSpec.describe Blog, :type => :model do
describe "#hogehoge" do
context "BlogのFactoryを作成した場合" do
it "テストデータが作成される" do
blog_model = FactoryGirl.create(:blog)
p blog_model
end
end
end
end
適当に書いたこのテストを実行すると...
<Blog id: 1, title: "MyString", word: "MyText", writer: "MyString", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
う、産まれましたーーーー!
元気なデフォルトテストデータが産まれましたよーーーーーー!
FactoryGirlと遊んでみる
テストデータの生成
デフォルトのテストデータを作成した際に、下記のようなコードを書きました。
blog_model = FactoryGirl.create(:blog)
このように、FactoryGirl.create(:モデル名)と記述した場合
DBにテストデータが保存されます。
試しにtest環境のDBを覗いてみると...
mysql> select * from blogs;
+----+----------+--------+----------+---------------------+---------------------+
| id | title | word | writer | created_at | updated_at |
+----+----------+--------+----------+---------------------+---------------------+
| 1 | MyString | MyText | MyString | 2016-**-** **:**:** | 2016-**-** **:**:** |
+----+----------+--------+----------+---------------------+---------------------+
Blogテーブルにテストデータが保存されていることが確認できました!
createの他にも、buildやattributesといったテストデータの生成方法があります。
FactoryGirl.build(:モデル名)
FactoryGirl.create(:モデル名)
FactoryGirl.attributes_for(:モデル名)
テストデータの上書き
テストコードを書いていくと、デフォルトのテストコードではなく
より現実的なデータを使用したくなるかもしれません。
そんな時は、テストデータを生成する際に、引数として「任意のテストデータ」を追加してみましょう。
Blogモデルには[writer]というブログの著者の名前を格納するカラムがあるので、
著者の名前を指定してみます。
blog_model = FactoryGirl.create(:blog, writer:'asopasomaso')
このテストコードを実行すると...
<Blog id: 2, title: "MyString", word: "MyText", writer: "asopasomaso", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
著者の名前が"asopasomaso"なテストデータが生成されます。
複数のテストデータ作成
ここまで取り上げてきたテストデータの生成方法では、
一度に1つのテストデータしか作成することができません。
複数のテストデータを生成したい場合は、create_listの引数に「生成したいテストデータの数」を追加してください。
例として、5つのBlogを作成してみます。
blog_model = FactoryGirl.create_list(:blog, 5)
このテストコードを実行すると...
<Blog id: 3, title: "MyString", word: "MyText", writer: "MyText", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
<Blog id: 4, title: "MyString", word: "MyText", writer: "MyText", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
<Blog id: 5, title: "MyString", word: "MyText", writer: "MyText", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
<Blog id: 6, title: "MyString", word: "MyText", writer: "MyText", created_at: "2016-**-** **:**:**", updated_at: "2016-**-** **:**:**">
<Blog id: 7, title: "MyString", word: "MyText", writer: "MyText",......
モデル名の後ろに追加した「生成したいテストデータの数」分、テストデータが生成されます。
FactoryGirlと付き合ってみる?
FactoryGirlの便利な機能はこれだけではありません。
連番データの作成や、関連データの作成などなど、
様々なテストデータを作成することができます。
(´-`).。oO(年明けにまとめようかな...)