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>
追記 : FactoryBot
FactoryGirl は FactoryBot に変わりました。アップグレードガイドは以下参照