質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

5871閲覧

RSpec テスト実行時のNameError: uninitialized constant FactoryBotのエラーについて

TA07

総合スコア1

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/11/30 23:19

編集2021/12/01 01:31

前提・実現したいこと

Railsの初学者です。RSpecテストを以下の文献を参考に取り組んでいます。
「Everyday Rails RSpecによるRailsテスト入門」 Aaron Summer著 

初期段階としてRSpecやFactoryBotのセットアップの確認をするため、ファクトリーの動作テストを行ったところ、NameError: uninitialized constantエラーが出てきており、躓いているため質問させていただきます。ご教授いただけると幸いです。

発生している問題・エラーメッセージ

# bin/rspec spec/models/user_spec.rb Running via Spring preloader in process 134 F Failures: 1) User has a valid factory Failure/Error: expect(FactoryBot.build(:user)).to be_valid NameError: uninitialized constant User # ./spec/models/user_spec.rb:5:in `block (2 levels) in <main>' # -e:1:in `<main>' Finished in 0.08281 seconds (files took 1.82 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/models/user_spec.rb:4 # User has a valid factory

該当のソースコード

spec/models/user_spec.rb

require 'rails_helper' RSpec.describe 'User', type: :model do it"has a valid factory"do expect(FactoryBot.build(:user)).to be_valid end end

spec/factories/users.rb

FactoryBot.define do factory :user do first_name {"Aaron"} last_name {"Summer"} end end

spec/rails_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install' require 'spec_helper' ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../config/environment', __dir__) # Prevent database truncation if the environment is production abort("The Rails environment is running in production mode!") if Rails.env.production? require 'rspec/rails' # Add additional requires below this line. Rails is not loaded until this point! require 'capybara/rspec' Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f } # Checks for pending migrations and applies them before tests are run. # If you are not using ActiveRecord, you can remove these lines. begin ActiveRecord::Migration.maintain_test_schema! rescue ActiveRecord::PendingMigrationError => e puts e.to_s.strip exit 1 end RSpec.configure do |config| # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures config.fixture_path = "#{::Rails.root}/spec/fixtures" # If you're not using ActiveRecord, or you'd prefer not to run each of your # examples within a transaction, remove the following line or assign false # instead of true. config.use_transactional_fixtures = true # You can uncomment this line to turn off ActiveRecord support entirely. # config.use_active_record = false # RSpec Rails can automatically mix in different behaviours to your tests # based on their file location, for example enabling you to call `get` and # `post` in specs under `spec/controllers`. # # You can disable this behaviour by removing the line below, and instead # explicitly tag your specs with their type, e.g.: # # RSpec.describe UsersController, type: :controller do # # ... # end # # The different available types are documented in the features, such as in # https://relishapp.com/rspec/rspec-rails/docs config.infer_spec_type_from_file_location! # Filter lines from Rails gems in backtraces. config.filter_rails_from_backtrace! # arbitrary gems may also be filtered via: # config.filter_gems_from_backtrace("gem name") end

spec/spec_helper.rb

RSpec.configure do |config| # rspec-expectations config goes here. You can use an alternate # assertion/expectation library such as wrong or the stdlib/minitest # assertions if you prefer. config.expect_with :rspec do |expectations| # This option will default to `true` in RSpec 4. It makes the `description` # and `failure_message` of custom matchers include text for helper methods # defined using `chain`, e.g.: # be_bigger_than(2).and_smaller_than(4).description # # => "be bigger than 2 and smaller than 4" # ...rather than: # # => "be bigger than 2" expectations.include_chain_clauses_in_custom_matcher_descriptions = true end # rspec-mocks config goes here. You can use an alternate test double # library (such as bogus or mocha) by changing the `mock_with` option here. config.mock_with :rspec do |mocks| # Prevents you from mocking or stubbing a method that does not exist on # a real object. This is generally recommended, and will default to # `true` in RSpec 4. mocks.verify_partial_doubles = true end # This option will default to `:apply_to_host_groups` in RSpec 4 (and will # have no way to turn it off -- the option exists only for backwards # compatibility in RSpec 3). It causes shared context metadata to be # inherited by the metadata hash of host groups and examples, rather than # triggering implicit auto-inclusion in groups with matching metadata. config.shared_context_metadata_behavior = :apply_to_host_groups # The settings below are suggested to provide a good initial experience # with RSpec, but feel free to customize to your heart's content. =begin # This allows you to limit a spec run to individual examples or groups # you care about by tagging them with `:focus` metadata. When nothing # is tagged with `:focus`, all examples get run. RSpec also provides # aliases for `it`, `describe`, and `context` that include `:focus` # metadata: `fit`, `fdescribe` and `fcontext`, respectively. config.filter_run_when_matching :focus # Allows RSpec to persist some state between runs in order to support # the `--only-failures` and `--next-failure` CLI options. We recommend # you configure your source control system to ignore this file. config.example_status_persistence_file_path = "spec/examples.txt" # Limits the available syntax to the non-monkey patched syntax that is # recommended. For more details, see: # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/ # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode config.disable_monkey_patching! # Many RSpec users commonly either run the entire suite or an individual # file, and it's useful to allow more verbose output when running an # individual spec file. if config.files_to_run.one? # Use the documentation formatter for detailed output, # unless a formatter has already been configured # (e.g. via a command-line flag). config.default_formatter = "doc" end # Print the 10 slowest examples and example groups at the # end of the spec run, to help surface which specs are running # particularly slow. config.profile_examples = 10 # Run specs in random order to surface order dependencies. If you find an # order dependency and want to debug it, you can fix the order by providing # the seed, which is printed after each run. # --seed 1234 config.order = :random # Seed global randomization in this process using the `--seed` CLI option. # Setting this allows you to use `--seed` to deterministically reproduce # test failures related to randomization by passing the same `--seed` value # as the one that triggered the failure. Kernel.srand config.seed =end end

追記

config/application.rb

config.time_zone = 'Tokyo' config.generators.test_framework = :rspec config.generators.system_tests = false config.generators.stylesheets = false config.generators.javascripts = false config.generators.helper = false config.generators do |g| g.test_framework :rspec, controller_specs: true, model_specs: true, request_spec: true, view_specs: false, helper_specs: false, routing_specs: false end

Gemfile

gem 'rails', '~> 6.1' gem 'bootsnap', require: false gem 'mysql2', '~> 0.5.3' gem 'puma', '~> 5.2.2' gem 'sass-rails', '~> 6.0' gem 'uglifier', '>= 4.2.0' gem 'jbuilder', '~> 2.11' gem 'solidus', '~> 2.11.0' gem 'solidus_auth_devise' gem 'solidus_i18n', github: 'solidusio-contrib/solidus_i18n', branch: 'master' gem 'paypalhttp', '~> 1.0' gem 'solidus_auth_devise' gem 'solidus_paypal_commerce_platform' group :development, :test do gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'rspec-rails' gem 'factory_bot_rails' gem 'pry-rails' gem 'pry-doc' gem 'pry-byebug' gem 'rails-erd' gem 'annotate' gem 'rubocop-airbnb' gem 'spring-commands-rspec' end group :test do gem 'capybara' gem 'webdrivers' gem 'launchy' end group :development do gem 'web-console', '>= 4.1.0' gem 'listen', '>= 3.0.5', '< 4.0' gem 'spring' gem 'spring-watcher-listen', '~> 2.0.1' end gem "aws-sdk", "~> 3.0" gem "aws-sdk-s3", require: false gem 'ast', '~> 2.4', '>= 2.4.2'

試したこと

「uninitialized constant」というエラーから、ファクトリーが定義されてない?FactoryBotに原因があるのではと考え、様々な記事や質問を調べ作り直したりRspec・FactoryBotの設定を見直してみましたが、エラーは変わりませんでした。

補足情報(FW/ツールのバージョンなど)

Rails 6.1.3.2
ruby 2.7.3
RSpec 3.10
factory_bot 6.2.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/12/01 00:08

・spec/modles/user_spec.rbとありますが、modelsではなく本当にこのフォルダに置いていますか? ・テストすべきモデル定義の方はどのようになっていますか? ・タイトルと実際に出たエラーメッセージが一致していないようです。
TA07

2021/12/01 01:34

maisumakunさん ご確認いただき、ありがとうございます。 誤字の修正と追記をしております。 ・spec/modles/user_spec.rb → spec/models/user_spec.rb タイプミスでした。申し訳ありません。 ・テストすべきモデル定義 知識不足で申し訳ありませんが、通常どちらのファイルへ記述していますでしょうか。
maisumakun

2021/12/01 01:48

> 知識不足で申し訳ありませんが、通常どちらのファイルへ記述していますでしょうか。 app/models/user.rbかと思います。
TA07

2021/12/02 14:22

maisumakunさん ヒントやアドバイスをいただいたお陰で解決することができました。 本当にありがとうございました!
guest

回答1

0

ベストアンサー

「Everyday Rails - RSpecによるRailsテスト入門」翻訳チームの伊藤です。
本書を読んでいただきどうもありがとうございます。

さて、ご質問の件ですが、uninitialized constant Userというメッセージを見るに、Userクラスをうまく見つけられていないようです。

以下の点を確認してみてください。

  • Userクラスは存在するか?(参考
  • rails_helperをrequireしているか?(参考

それと、以下のコマンドを実行して、その実行結果(エラー全体)を追記してください。

bundle exec rspec --backtrace

よろしくお願いします。

投稿2021/12/01 01:10

jnchito

総合スコア357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TA07

2021/12/02 14:20

伊藤さん ご確認いただき、ありがとうございます。 ・rails_helperをrequireしているか? →漏れていたため、追記致しました。 ・Userクラスは存在するか? →RSpecのテストデータはFactoryBotで個別に定義して作り、動作確認を行うものと誤った認識であったため、アプリケーションのモデル(app/models/,,)で定義していない状態で行ってしまっていました。 Userクラスを作成し定義することで無事にテストが通りました! アプリケーションとRSpecとの関係性や繋がりが理解できていなかったため、起きたエラーでした。 ご教授いただき、大変ありがとうございました。 p.s. まさか伊藤さんにご回答いただけるだなんて、大変光栄です!! 今後の勉強の励みになります! また、「Everyday Rails Testing with RSpec」を日本語に翻訳してくださった伊藤さんをはじめとする翻訳チームの皆様に感謝しております。
jnchito

2021/12/03 02:10

うまくいってよかったです!今後とも「Everyday Rails - RSpecによるRailsテスト入門」をよろしくお願いします????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問