じぶんメモ

プログラミングのメモ、日常のメモとか。

FactoryGirlを使用したデータの作成

Gemのインストール

Gemfileに以下を追加し、bundle installを実行する。
RSpecを使用することを前提に書くのでRSpecも一緒にインストールしておく。

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

bundle install後にrspecのインストールをする。

rails g rspec:install

ここでうまくいかないときはspringが悪さをしているので、一度停止させておく。

spring stop

インストールが完了したら、再起動させる。

spring binstub

FactoryGirlのインクルード

インクルードしておいたほうが、FactoryGirlのメソッドを使用する際に、
クラス名を省略できる。

#spec/spec_helper.rb
RSpec.configure do |config|
  # FactoryGirlのインクルード
  config.include FactoryGirl::Syntax::Methods

Factoryファイルの作成と使用

spec/factoriesディレクトリを作成し、対象のモデル名のファイルを作成する。

# productモデルのFactoryファイル(spec/factories/product.rb)
FactoryGirl.define do
  # product レコードの登録用ファクトリー
  factory :product do
    # 名前は複数回実行されることを想定してかぶらないように連番設定する
    sequence(:name)  { |n| "MyProduct#{n}" }
    price 100
    category_id 1
  end
end

作成したFactoryは以下のように使用する。

  # 例としてテスト時にFactoryGirlでデータを作成させる。

  describe "GET /products.json" do
    # テスト前にFactoryGirlでテーブルにデータを登録しておく。
    # create_listは第2引数の数だけデータを作成する。
    # spec_helper.rbにてFactoryGirlをインクルードしているため、create_listだけで使用できる。
    before { @products = create_list(:product, 2) }

    example "一覧情報を取得できること" do
      # GET /products.json にアクセスする
      get api_v1_products_path format: :json

      # ステータスコードの確認
      expect(response.status).to eq 200

      # JSONの確認
      json = JSON.parse(response.body)
      expect(json.size).to     eq @products.count
      expect(json[0]["id"]).to eq @products[0].id
      expect(json[1]["id"]).to eq @products[1].id
      # 詳細の値の確認は省略
    end
  end

その他FactoryGirlの便利な使い方は、以下の記事を参照。

ruby-rails.hatenadiary.com