で
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してますが、これはテストファイルを生成してからいじってないから出てるだけですので気にしなくていいです。