前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー