

現在rspecを使用して、テストコードの勉強中です。  
そこでfactory_botを使用していますが、buildのところでエラーが出てしまいます。  
KeyError: Factory not registered:  
こちらがエラー文です。

<https://masawada.hatenablog.jp/entry/2018/01/06/012845>  
こちらの記事を参考に記述を変更してみましたが、解決しません。  
ご教授お願いいたします。

Rails 5.2.4.1  
ruby 2.5.1

spec/modles/comment_spec.rb

[code]

    require 'rails_helper'
    
    describe Comment do
      describe '#create' do
    
        it "ニックネームが空では登録できない" do
          comment = build(:comment,nickname: "")
          comment.valid?
          expect(comment.errors[:nickname]).to include("を入力してください")
        end
    
      end
    end
    
[/code]

spec/factories/comments.rb

[code]

    FactoryBot.define do
    
      factory :comment do
        nickname                  {"田中"}
        text                      {"テキスト"}
      end
    
    end
    
[/code]

ターミナル

[code]

    Comment
      #create
        ニックネームが空では登録できない (FAILED - 1)
    
    Failures:
    
      1) Comment#create ニックネームが空では登録できない
         Failure/Error: comment = build(:comment,nickname: "")
    
         KeyError:
           Factory not registered: "comment"
         # ./spec/models/comment_spec.rb:7:in `block (3 levels) in <top (required)>'
         # ------------------
         # --- Caused by: ---
         # KeyError:
         #   key not found: "comment"
         #   ./spec/models/comment_spec.rb:7:in `block (3 levels) in <top (required)>'
    
    Finished in 0.04478 seconds (files took 1.45 seconds to load)
    1 example, 1 failure
    
    Failed examples:
    
    rspec ./spec/models/comment_spec.rb:6 # Comment#create ニックネームが空では登録できない
    
[/code]

gemfile

[code]

    source 'https://rubygems.org'
    git_source(:github) { |repo| "https://github.com/#{repo}.git" }
    
    ruby '2.5.1'
    
    # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
    gem 'rails', '~> 5.2.3'
    # Use mysql as the database for Active Record
    gem 'mysql2', '>= 0.4.4', '< 0.6.0'
    # Use Puma as the app server
    gem 'puma', '~> 3.11'
    # Use SCSS for stylesheets
    gem 'sass-rails', '~> 5.0'
    # Use Uglifier as compressor for JavaScript assets
    gem 'uglifier', '>= 1.3.0'
    # See https://github.com/rails/execjs#readme for more supported runtimes
    # gem 'mini_racer', platforms: :ruby
    
    # Use CoffeeScript for .coffee assets and views
    gem 'coffee-rails', '~> 4.2'
    # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
    gem 'turbolinks', '~> 5'
    # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
    gem 'jbuilder', '~> 2.5'
    # Use Redis adapter to run Action Cable in production
    # gem 'redis', '~> 4.0'
    # Use ActiveModel has_secure_password
    # gem 'bcrypt', '~> 3.1.7'
    
    # Use ActiveStorage variant
    # gem 'mini_magick', '~> 4.8'
    
    # Use Capistrano for deployment
    # gem 'capistrano-rails', group: :development
    
    # Reduces boot times through caching; required in config/boot.rb
    gem 'bootsnap', '>= 1.1.0', require: false
    
    group :development, :test do
      # Call 'byebug' anywhere in the code to stop execution and get a debugger console
      gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
      gem 'rspec-rails'
      gem 'factory_bot_rails'
    end
    
    group :development do
      # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
      gem 'web-console', '>= 3.3.0'
      gem 'listen', '>= 3.0.5', '< 3.2'
      # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
      gem 'spring'
      gem 'spring-watcher-listen', '~> 2.0.0'
    end
    
    group :test do
      # Adds support for Capybara system testing and selenium driver
      gem 'capybara', '>= 2.15'
      gem 'selenium-webdriver'
      # Easy installation and use of chromedriver to run system tests with Chrome
      gem 'webdrivers'
    end
    
    # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
    gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
    gem "haml-rails", ">= 1.0", '<= 2.0.1'
    gem "pry-rails"
    gem 'devise'
    gem 'carrierwave'
    gem 'mini_magick'
    gem "font-awesome-sass"
    gem 'jquery-rails'
    gem 'kaminari'
    
[/code]

rails_helper.rb

[code]

    # 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!
    
    # Requires supporting ruby files with custom matchers and macros, etc, in
    # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
    # run as spec files by default. This means that files in spec/support that end
    # in _spec.rb will both be required and run as specs, causing the specs to be
    # run twice. It is recommended that you do not name files matching this glob to
    # end with _spec.rb. You can configure this pattern with the --pattern
    # option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
    #
    # The following line is provided for convenience purposes. It has the downside
    # of increasing the boot-up time by auto-requiring all files in the support
    # directory. Alternatively, in the individual `*_spec.rb` files, manually
    # require only the support files necessary.
    #
    # 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|
      config.include FactoryBot::Syntax::Methods
    
      config.before(:all) do
        FactoryBot.reload
      end
      # 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
    
    
[/code]

spec_helper.rb

[code]

    # This file was generated by the `rails generate rspec:install` command. Conventionally, all
    # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
    # The generated `.rspec` file contains `--require spec_helper` which will cause
    # this file to always be loaded, without a need to explicitly require it in any
    # files.
    #
    # Given that it is always loaded, you are encouraged to keep this file as
    # light-weight as possible. Requiring heavyweight dependencies from this file
    # will add to the boot time of your test suite on EVERY test run, even for an
    # individual file that may not need all of that loaded. Instead, consider making
    # a separate helper file that requires the additional dependencies and performs
    # the additional setup, and require it from the spec files that actually need
    # it.
    #
    # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
    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
    
    
[/code]


CC BY-SA 4.0
2020-04-02T03:44:30.073
65296
2023-06-01T13:08:11.000
2020-04-02T03:51:23.520
39469
39469
question
ruby-on-rails ruby rspec テスト
factorybotが動作しません


考えられるのは`spring`の問題ですね。`spring stop`で`spring`を停止させたのち、再度実行してみてください。


CC BY-SA 4.0
2020-04-02T08:34:26.630
65304
2020-04-02T08:34:26.630
442
65296
answer