factory_botを導入したらFailure/Error: config.include FactoryBot::Syntax::Methodsが出た

Docker環境でRspecをインストールする

https://qiita.com/at-946/items/aaff42e4a9c2e4dd58ed

を参考にしながらfactory_botを導入した。

しかし、spec/rails_helper.rbに以下を追加するとエラーが出た。

問題点

spec/rails_helper.rb

require 'capybara/rspec'

RSpec.configure do |config|
  # FactoryBotの利用をON
  config.include FactoryBot::Syntax::Methods

  # DatabaseCleanerの設定
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.before(:all) do
    DatabaseCleaner.start
  end

  config.after(:all) do
    DatabaseCleaner.clean
  end
end

出たエラー

$ docker-compose exec app rspec

An error occurred while loading spec_helper.
Failure/Error: config.include FactoryBot::Syntax::Methods

NameError:
  uninitialized constant FactoryBot
# ./spec/spec_helper.rb:102:in `block in <top (required)>'
# ./spec/spec_helper.rb:100:in `<top (required)>'
No examples found.


Finished in 0.00006 seconds (files took 5.98 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples

解決策

spec/rails_helper.rbの先頭に以下を追加したら解決した。

spec/rails_helper.rb

require 'capybara/rspec'

RSpec.configure do |config|
  # FactoryBotの利用をON
  config.include FactoryBot::Syntax::Methods

  # DatabaseCleanerの設定
  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.before(:all) do
    DatabaseCleaner.start
  end

  config.after(:all) do
    DatabaseCleaner.clean
  end
end

テストデータ作成

これで問題なくテストデータを使えます。

spec/factories/users.rb

FactoryBot.define do
  factory :ilya, class: User do
    name { 'Illyasviel von Einzbern' }
    email { 'iliya@fate.pi' }
    password { 'password' }
    password_confirmation { 'password' }
  end
end
@user = create(:ilya)

@user = build(:ilya)
@user.save

でDBにデータを保存できます。

結果

エラーが出なくなりました。

$ docker-compose exec app rspec
*..

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) User add some examples to (or delete) /app/spec/models/user_spec.rb
     # Not yet implemented
     # ./spec/models/user_spec.rb:4


Finished in 4.18 seconds (files took 17.52 seconds to load)
3 examples, 0 failures, 1 pending

1 pendingしてますが、これはテストファイルを生成してからいじってないから出てるだけですので気にしなくていいです。