Ruby on Rails開発のインターン (Day 30)

こんにちは、皆さん!

さーて、今日は職場のプログラムのテストで使われているfactory-girlというジェムの詳細を読んで、使えるようにするところから。
昨日、自分のウェブサイトを完成させたので、今は少しほっとしていて、仕事に集中できると思う。


  • トピック:
  1. factory_botジェムとは?
  2. factory_botの始め方
  3. factory_botジェムを効率的に使う方法


  • 疑問:


  • 問題:
  1. マップテスト用のデータを効率的に定義する方法を見つける(factory_botジェムで解決)


  • 学習した内容:
  1. factory_botジェムのテンプレートを作る方法


  • 今後やってみたいこと:


  • リソース:
  1. File: GETTING_STARTED — Documentation for factory_bot (4.11.1)


factory_botジェムとは?

factory_botジェムはデータを作るときのテンプレートを作成してくれるもの。これはたくさんの一時的なデータを作るときに役に立つ。

簡単な例を挙げると、

# spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name "Bob"
    email "bob@example.com"
    admin false
  end
end

こうして、定義した後、任意のspecファイルで下記のようなコードを書くと、

user = create(:user)

"Bob"という名前で"bob@example.com"というメールのユーザーを簡単に作れちゃうというわけだ。
これは下記のコードを実行するのと同じことをしている。

user = User.create(name: "Bob", email: "bob@example.com")

これでどれだけのコードを省くことができたのかが分かるでしょう。特に、これを何度も繰り返せば、その分だけ、このジェムの効力も大きくなる。

factory_botの始め方

まず、初めに、ジェムのインストール。Gemfileに下記のを入れる。

gem "factory_bot_rails", "~> 4.0"

そして、bundle install

そしたら、設定のセットアップとして、下記のファイルを作成して内容を入れる。

# spec/support/factory_bot.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

Railsを使わない場合はこちら↓↓

# RSpec without Rails
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods

  config.before(:suite) do
    FactoryBot.find_definitions
  end
end

そしたら、specファイルがこの設定を使えるようにするため、下記のようにrails_helper.rbにファイルのインポートを入れる。

require 'support/factory_bot'

そしたら、データを作る準備はできたので、下記の簡単な例を試してみよう(始める前にUserのモデルが必要だが

# spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name "Bob"
    email "bob@example.com"
    admin false
  end
end

そしたら、Rspecのテストコード内で下記のように実行するだけ。

user = create(:user)

これで、もともと定義した通りのユーザーをデータベースに追加できる。

factory_botジェムを効率的に使う方法

factory_botジェムを最大限に利用するには、先ほどのように定義したデータにさらにケースごとに必要な部分だけを追加したデータを作る必要がある。
下記のコードの例では、アドミンにするかどうかというケースを設置した。
先ほどの例に下記のようにコードをつけ足すと、アドミンのケースが完成する。

# spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name "Bob"
    email "bob@example.com"
    admin false

    trait :admin do
      admin true
    end
  end
end

factory_botのおかげで、アドミンユーザーを作るときに変更する必要のない元から定義された名前とメールを再定義することなく、使用することができる。なので、アドミンの場合は、一つだけしか定義するコードがない。

そして、これを使うためには、ただ下記のようにすればよい。

admin_user = create(:user, :admin)

これで、下記のと同じことをしたことになる。

admin_user = User.create(name: "Bob", email: "bob@example.com", admin: true)

このようなケースがいくつも存在するとしたら、いったいどれほどのコードを省くことができるのでしょうか?
このジェムはマジで役に立ち、特に大きなプロジェクトで使うことによって、その真価を発揮するのだ。

まとめ

テストコードを書くための知識をより多く学べたのは大きかった。この知識はさらに、職場でやろうとしていたテストコードにおけるデータの効率的な定義方法に合致するため、職場で大きく貢献できるでしょう。最初は職場のテストコードを見ていて、意味が分からないようなシンタックスを使っているようだったが、今では手に取るように理解できるというね(笑)


ご精読ありがとうございました。では、また次回まで✌



Day 31はこちら↓↓
programming-shop.hatenablog.com


Day 29はこちら↓↓
programming-shop.hatenablog.com