

現在ポートフォリオ (Rails-api,React) を作成中で、本番環境herokuまでデプロイが終わりました。  
以前書いたRspecを実行し問題ないことを確認したあと、CI/CDを導入していこうと思っていたところだったのですが、Rspecが以前は出なかったエラーが出てしまい、ググっても解決できなかったので、投稿させていただきます。

以下のコマンドを実行後、エラーが表示されてしまう。

[code]

    docker-compose run api bundle exec rspec
    
[/code]

**エラーメッセージ:**

[code]

    Creating cooklog_api_run ... done
    
    An error occurred while loading ./spec/models/favorite_spec.rb.
    Failure/Error: abort("The Rails environment is running in production mode!") if Rails.env.production?
    
    NameError:
      uninitialized constant Rails
    # ./spec/rails_helper.rb:7:in `<top (required)>'
    # ./spec/models/favorite_spec.rb:1:in `require'
    # ./spec/models/favorite_spec.rb:1:in `<top (required)>'
    
[/code]

以下helperをrequireしているテストは全て同じように表示されます。

[code]

    No examples found.
    
    Finished in 0.00015 seconds (files took 0.42682 seconds to load)
    0 examples, 0 failures, 8 errors occurred outside of examples
    
[/code]

後述する rails_helper.rb の7行目の以下記述がエラーとして出てきているようです。

[code]

    abort("The Rails environment is running in production mode!") if Rails.env.production?
    
[/code]

本番環境としてtestを実行してしまっているのでしょうか？

### 試したこと

`rails console` で現在の環境を確認

[code]

    [1] pry(main)> Rails.env
    => "development"
    
[/code]

Dockerを使わず、ローカルの環境でも `bundle exec rspec` を実行したところ、エラー内容は変わりませんでした。

原因がわからず、困惑しております。  
お知恵をいただけるとありがたいです。  
最後までお読みいただき、ありがとうございます。

* * *

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', __FILE__)
    #エラーが出るためコメントアウト
    # 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")].each { |f| require f }
    # 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|
      # 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")
      config.include FactoryBot::Syntax::Methods
      config.include Devise::Test::IntegrationHelpers, type: :request
      # config.include Devise::Test::IntegrationHelpers, type: :system
      config.include LoginHelpers
      config.include JsonApiHelpers
      # テストケース共通の事前処理
      config.before(:each) do
    
        # let(:rspec_session) で指定された値を セッションの初期値とします
        session = defined?(rspec_session) ? rspec_session : {}
    
        # destroyメソッドを実行してもエラーにならないようにします（必要であれば）
        session.class_eval { def destroy; nil; end }
    
        # 追記 実行後のセッションを取得できるようにする
        config.add_setting(:session, :default => session)
    
        # 変更 sessionメソッドをRSpec.configuration.sessionで上書き
        allow_any_instance_of(ActionDispatch::Request).to receive(:session).and_return(RSpec.configuration.session)
      end
    end
    
[/code]


CC BY-SA 4.0
2022-01-27T03:19:56.610
85962
2022-01-27T04:50:19.357
2022-01-27T04:50:19.357
3060
51107
question
ruby-on-rails rspec
Rspecを実行すると、Rails environment is running in production mode!とエラーが出てしまう


再度`docker-compose run api rails generate rspec:install`を実行したところ、  
テストが動くようになりました。

しかし、まだrspecでjsonを使えるようにする設定がおかしな挙動するようになったので  
別のエラーとして対応してきます。  
閲覧いただきありがとうございました。


CC BY-SA 4.0
2022-01-27T04:38:38.740
85964
2022-01-27T04:38:38.740
51107
85962
answer