FactoryGrilの書き方いろいろ

テストデータの定義に使われるFactoryGirlの書き方に関するメモです。

データ投入時に値を指定する

FactoryGirlの定義ファイルに値を記述するのではなく、データ投入時(FactoryGirl.createするとき)にどのようなデータにするかを指定する方法です。FactoryGirlの定義ファイルのカラムにシンボルを指定しておき、FactoryGirl.createするときにシンボルとともに設定したい値を指定します。

# FactoryGirlデータファイル
FactoryGirl.define do
  factory :user, :class => User do
    name: "田村くん"
    address :address
  end
end
# RSpecファイル
describe 'User' do
  before do
     @user = FactoryGirl.create(:user, address:"山形県米沢市")
  end
end

 

 

 

Rails – RSpecの設定と使い方

RSpecのRailsプロジェクトへのインストール

Gemに以下の記述を追加します。

group :development, :test do
  gem "rspec-rails"
  gem "factory_girl_rails"
end

 

RSpecの初期化

以下のコマンドを実行し、RSpecのテストファイルを格納するディレクトリ等を作成します。

rails g rspec:install

 

スペックファイルの生成

例えばUserというモデルのスペックファイルを生成する場合は以下のコマンドを実行する。

rails g rspec:model user

 

RSpecによるテストの実行

array_spec.rbというスペックファイルのテストを実行する場合には以下のコマンドする。

rspec spec/model/user_spec.rb

 

データ投入時にモデルのバリデーションを無視する方法

FactoryGirl.define do
  factory :item_a, :class => Item do
    company_id 1

    # save時にvalidationをスキップする
    to_create do |instance|
      instance.save validate: false
    end 
  end
end

 

 

 

ハマりどころ

FactoryGirlファイルの場所の明示が必要

テストデータを作成するためにFactoryGirlを組み合わせて使ったのですが、ちゃんとFactoryGirlファイルを準備しているのに、その定義内容ではなくNULLがDBに投入されようとしてエラーになってしまいました。

fixtureの代替としてFactoryGirlを使用することを設定に明記していないのが原因でした。以下の一文をconfig/application.rbに追記すればエラーが発生しなくなりました。

config.generators.fixture_replacement :factory_girl, dir: 'spec/factories'

 

FactroyGirlファイルの内容を変えたときはspringの再起動が必要

springを使ってrspecテストを高速化している場合、FactoryGirlファイルの内容はrspec初回起動時のものが保持され続けるので注意が必要です。FactoryGridファイルを変更したら以下のコマンドを実行して一度springを止め、再び再起動(spring rspec)しましょう。

spring stop