プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

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として指定します。

以上です。