Factory Girlを使用してデータベースにデータを読み込ませる
Factory Girl
恥ずかしながら、いままでテストに使用するデータはデータマッパーを使ったスクリプトを作成して対処していました。 Factory Girlでは簡単に登録できるんですね。RSpecを使用する際に親和性が高いみたいです。
何はともあれGemfileを書いてbundle install
gem 'factory_girl_rails', '4.1.0'
モデルを登録する
シミュレートするモデルを登録する。 factoryメソッドにuserシンボルが渡されると、それをUserモデルのものと認識してくれます。 ファイルはspec/factories.rbなどに書きます。ここにあるファイルをRSpecが自動的に読み込んでくれます。 今回はオブジェクトをDBに登録するまでを処理します。
FactoryGirl.define do factory :user do name "hogehoge" email "hogehoge@example.com" end end
これを実際のテストにlet関数で宣言します。
let(:user) { FactoryGirl.create(:user) }
これでUserクラスのファクトリーを作成します。 createメソッドの場合はDBへの登録まで行いますが、buildメソッドだとDB登録までせずオブジェクトを生成だけの処理になります。
let(:user) { FactoryGirl.build(:user) }
あとはUserクラスでやりたいテストを書くだけです。
FactoryGirlは結構遅い
BCryptアルゴリズムで暗号化したデータを扱った場合、ハッシュの生成に時間がかかるため処理が遅くなります。仕様上仕方ないそうです。 config/environments/test.rbに以下のように書くことで暗号化を回避できます。
SampleApp::Application.configure do . . . # Speed up tests by lowering BCrypt's cost function. require 'bcrypt' silence_warnings do BCrypt::Engine::DEFAULT_COST = BCrypt::Engine::MIN_COST end end
コストファクターを最小限にするということで、MIN_COSTとして指定します。
以上です。