【Rails】FactoryGirlの導入方法

スポンサーリンク

Rails で FactoryGirl を使用するための導入方法です。

FactoryGirlの導入

Gemfile にfactory_girl_railsを追加してbundle installを実行してください。

group :development, :test do
  gem 'factory_girl_rails'
end

factory_girl_rails を追加して読み込むと、ジェネレータを使用した場合にデフォルトの Fixture ではなく Factory Girl のファイルが作成されるようになります。これを無効にしたい場合はconfig/application.rbに以下を追加します。

config.generators do |g|
  g.factory_girl false
end

デフォルトの Factory ディレクトリはtest/factoriesです。テストフレームワークが RSpec に設定されている場合spec/factoriesです。このディレクトリを変更する場合はdir: 'custom/dir/factories'オプションを使用します。

config.generators do |g|
  g.factory_girl dir: 'custom/dir/factories'
end

Factory のデフォルトファイル名はモデル名.rbですがsuffix: 'some_suffix'オプションで後ろに付ける任意の名前を指定することができます。

config.generators do |g|
  g.factory_girl suffix: 'hoge'
end
$ ./bin/rails g model author name:string
...
      create        spec/factories/authors_hoge.rb

以上の設定は  別の記事 でも書いていたfixture_replacementでも同様の設定が可能です。

config.generators do |g|
  g.fixture_replacement :factory_girl, dir: 'spec/factories', suffix: 'hoge'
end

 GitHub - thoughtbot/factory_girl_rails: Factory Girl ♥ Rails

FactoryGirl呼び出しの設定

spec/support/factory_girl.rbに次の設定を追加するとFactoryGirl.build( ... )FactoryGirl.create( ... )と書いていた部分をbuild( ... )create( ... )という省略した構文で書けるようになります。

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end

上記の設定はspec/rails_helper.rbにも記述できますが、spec/supportディレクトリに作成した場合はファイルを読み込むための設定が必要です。spec/rails_helper.rb内で以下のコメントアウトされている箇所を外して下さい。

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

 factory_girl/GETTING_STARTED.md at master · thoughtbot/factory_girl · GitHub

Rails Consoleでの使用

FactoryGirl は console でそのまま使えます。環境を指定しないと development になるので test 環境で使いたい場合は以下ののように指定して下さい。

$ ./bin/rails c test --sandbox
irb(main):001:0> FactoryGirl.build(:user)
=> #<User id: nil, name: "Test User", email: "test.user@example.com", created_at: nil, updated_at: nil>

FactoryGirl を省略してメソッドを呼び出したい場合は以下を読み込みます。Faker を使用してる場合も起動した状態だと使えないため require しておきます。

irb(main):002:0> include FactoryGirl::Syntax::Methods
=> Object
irb(main):003:0> require 'faker'
=> false
irb(main):004:0> create(:user)
   (1.2ms)  SAVEPOINT active_record_1
  User Exists (1.2ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY 'test.user@example.com' LIMIT 1
  User Exists (0.4ms)  SELECT  1 AS one FROM `users` WHERE `users`.`name` = BINARY 'Test User' LIMIT 1
  SQL (0.6ms)  INSERT INTO `users` (`name`, `email`, `encrypted_password`, `created_at`, `updated_at`, `confirmation_token`, `confirmation_sent_at`) VALUES ('Test User', 'test.user@example.com', '$2a$04$8bW0wSw./JNRO4yTURH6GeNaBQG/05JgaCI/eqaiRh7wrDL5i8lz.', '2017-01-12 08:47:41', '2017-01-12 08:47:41', 'o5gtkG_WAsRiJ7CsYzJY', '2017-01-12 08:47:41')
   (0.2ms)  RELEASE SAVEPOINT active_record_1
=> #<User id: nil, name: "Test User", email: "test.user@example.com", created_at: nil, updated_at: nil>