Ruby on Rails開発のインターン (Day 30)
こんにちは、皆さん!
さーて、今日は職場のプログラムのテストで使われているfactory-girl
というジェムの詳細を読んで、使えるようにするところから。
昨日、自分のウェブサイトを完成させたので、今は少しほっとしていて、仕事に集中できると思う。
- トピック:
- 疑問:
- 問題:
- マップテスト用のデータを効率的に定義する方法を見つける(
factory_bot
ジェムで解決)
- 学習した内容:
factory_bot
ジェムのテンプレートを作る方法
- 今後やってみたいこと:
- リソース:
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
の始め方
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)
このようなケースがいくつも存在するとしたら、いったいどれほどのコードを省くことができるのでしょうか?
このジェムはマジで役に立ち、特に大きなプロジェクトで使うことによって、その真価を発揮するのだ。
まとめ
ご精読ありがとうございました。では、また次回まで✌