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

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

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

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

Ruby on Rails

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

解決済

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

TA07
TA07

総合スコア1

RSpec

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

Ruby on Rails

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

1回答

0評価

0クリップ

1100閲覧

投稿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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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さん ヒントやアドバイスをいただいたお陰で解決することができました。 本当にありがとうございました!

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

RSpec

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

Ruby on Rails

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