環境
ruby 2.6.3
Rails 5.1.1
gem "rspec-rails", '~> 3.6.0'
gem "factory_bot_rails", "~>4.11.0"
発生した状況
spec/factories/users.rb
FactoryBot.define do
factory :user do
first_name {"Aaron"}
Last_name {"Sumner"}
email {"tester@example.com"}
password {"password"}
end
end
spec/models/user_spec.rb
RSpec.describe User, type: :model do
it "has a valid factory" do
expect(FactoryBot.build(:user)).to be_valid
end
end
発生したエラー
$ bin/rspec
# 略
Failures:
1) User has a valid factory
Failure/Error: expect(FactryBot.build(:user)).to be_valid
NameError:
uninitialized constant FactryBot
# ./spec/models/user_spec.rb:9:in `block (2 levels) in <top (required)>'
# -e:1:in `<main>'
Finished in 0.49794 seconds (files took 0.46908 seconds to load)
13 examples, 1 failure
Failed examples:
rspec ./spec/models/user_spec.rb:8 # User has a valid factory
対処
初めてFactoryBotを使用したので設定が悪いのかな〜?と調べてみて次の記事などを参考にするも解決せず
RSpecを導入した時、詰まったこと(NameError: uninitialized constant)
試しに次のようにコードを変更するとメッセージが変わった
spec/models/user_spec.rb
RSpec.describe User do # type: :model を削除
it "has a valid factory" do
expect(FactoryBot.build(:user)).to be_valid
end
end
$ bin/rspec
# 略
Failures:
1) User has a valid factory
Failure/Error: expect(FactoryBot.build(:user)).to be_valid
NoMethodError:
undefined method `Last_name=' for #<User:0x00007f9d1c450428>
Did you mean? last_name
last_name?
first_name=
# ./spec/models/user_spec.rb:9:in `block (2 levels) in <top (required)>'
# -e:1:in `<main>'
Finished in 0.51206 seconds (files took 0.36496 seconds to load)
13 examples, 1 failure
Failed examples:
rspec ./spec/models/user_spec.rb:8 # User has a valid factory
はい!単なるスペルミスです!
最初に疑うべきでしたね...
修正後がこちら
spec/factories/users.rb
FactoryBot.define do
factory :user do
first_name {"Aaron"}
last_name {"Sumner"} #Last_nameになっていた
email {"tester@example.com"}
password {"password"}
end
end
後書き
記事に残すまでも無いような内容ですが検索して1件もヒットしなかったので一応...
あと自分への戒めですね。。
describe で type: :model を削除するとエラーメッセージが変わったのは不思議でしたがまた使えそう?なので覚えておこうと思います。
理由が分かる方がいましたら是非コメントで教えてください!