Rspecは私のモデルクラスを認識していません。初期化されていない定数エラー


86

Ruby onRailsアプリケーションでモデルのRspecのテストを書いています。そして、「rspecspec」の起動中にこのエラーが発生します

command:
/spec/models/client_spec.rb:4:in `<top (required)>': uninitialized constant Client (NameError)

Rails4.0.0とRuby2.0.0を使用しています

これが私のclient_spec.rbです:

require 'spec_helper'


describe Client do

  it 'is invalid without first_name', :focus => true do
     client = Client.new
     client.should_not be_valid
  end
end

そしてGemfile:

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.rc1'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0.rc1'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more: 
gem 'turbolinks'

gem 'jbuilder', '~> 1.0.1'

group :development do
  gem 'rspec-rails'
end

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

group :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'database_cleaner'
end

そして最後にclient.rb(RORモデルとクラス):

class Client < ActiveRecord::Base

  has_many :cars
  has_many :orders
  has_one :client_status
  has_one :discount_plan, through: :client_status

  validates :email, format: { with: /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})\z/, :message => "Only emails allowed", :multiline => true }
  validates :email, presence: true, if: "phone.nil?"
  #validates :phone, presence: true, if: "email.nil?"
  validates :last_name, :first_name, presence: true
  validates :last_name, :first_name, length: {
      minimum: 2,
      maximum: 500,
      wrong_length: "Invalid length",
      too_long: "%{count} characters is the maximum allowed",
      too_short: "must have at least %{count} characters"
     }
end

それが役に立つとしたら、私のspec_helper.rbファイル:

# This file was generated by the `rspec --init` command. Conventionally, all
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
# Require this file using `require "spec_helper"` to ensure that it is only
# loaded once.
#
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
  config.treat_symbols_as_metadata_keys_with_true_values = true
  config.run_all_when_everything_filtered = true
  config.filter_run :focus

  # 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'

  #config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

   config.before(:each) do
     DatabaseCleaner.start
   end

   config.after(:each) do
     DatabaseCleaner.clean
   end

  end

私のために働いたのは、--require spec_helperから行を削除すること.rspecでした。すでに含まれているので--require rails_helper、後にロードされていましたspec_helper
Yuri Ghensev 2016

回答:


91

あなたのspec_helperファイルには、いくつかの重要なコマンドが含まれていません。具体的には、config / environmentと初期化は含まれていませんrspec-rails

spec/spec_helper.rbファイルの先頭に次の行を追加できます

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

またはあなたはただ走ることができます

rails generate rspec:install

spec_helperで使用するために生成されたもので上書きしますrspec-rails


30
新しいバージョンのRSpecはspec/spec_helper.rbファイルからいくつかのものを移動するので、今度はspec/rails_helper.rbファイルも取得します。を実行するとrails generate rspec:installこれが生成されます(rspec-rails 3.0.1、rails 4.1.1)。判明しrails_helper.rbたファイルはあなたにいくつかのようなコードが含まれていると、あなたのスペックでのRailsをロードする際に必要とされるべきです。
デニス

デニスは正しい方向に進んでいます。Railsの機能をテストする予定のテストの構成をからspec_helper.rbに移動する必要があると思いますrails_helper.rb。また、内のコメントを必ずお読みくださいrails_helper.rbどのように言及rspec-railsすることができinfer_spec_type_from_file_location、あなたが別にあなたのスペックのテストを移動させる可能性のあるspec/*/サブディレクトリ。
スティーブンヘンダーソン

21
spec/rails_helper.rb自動的に含めたい場合は.rspec、追加することでそれを行うことができます--require rails_helper
schmijos

3
しかし、2つのヘルパーを分離するという点--require rails_helper.rspec打ち負かすために追加することはありません。その場合、Railsを必要としない仕様の場合でも、常にrails_helper(したがってRails)をロードすると思います。
Jon Garvin 2014

これは大いに役立ちました。私は実際に自分を更新する必要があり.travis.ymlましたbin/rspec
Peter Ehrlich 2015年

155

rails 4.x(rspec-rails 3.1.0)では

require "rails_helper"  # this

ない

require "spec_helper"   # not this

スペックファイル内


2
これはグーグルの目的のためにどこかでそれ自身の質問であるべきです。私はカピバラが壊れている、ランチが壊れている、または壊れている(宝石を埋める)と思っていたものに苦労してきましたが、それはすべてこの1行の変更によるものでした。
EthanK 2015

レール3.2.22(rspec-rails 3.2.1)で「rails_helper」の作業が必要
shilovk 2015

これは非常に混乱しました。新しいRails6アプリを作成し、最初の仕様を実行しています。間違いなくrails_helper.rbファイルをロードしていましたが、仕様を実行しようとした後、ロードしようとしていたことがわかりました。require "rails_helper"私のスペックのトップに追加され、私は行って良かったです。
トラビス

19

このようにファイルを追加することもでき--require rails_helperます.rspec

--color
--require spec_helper
--require rails_helper

この後、すべての仕様でrails_helperを要求する必要はありません。


2
これは、すべてのテストでRails環境をロードする必要がある場合に最適ですが、そうでない場合は、上記の別の回答のコメントで言及されているように、最終的にテストスイートが必要以上に遅くなります。
jamesmarkcook 2016年

8

Rails5.0.0.1を使用しています。
これが私がこの懸念を解決した方法です。

Gemfileに、-> gem'rspec-rails '、 "> = 2.0.0.beta"を追加してください

そのようです、

group :development, :test do
  gem 'rspec-rails', ">= 2.0.0.beta"
end

理由: rspec-railsが追加されておらず、rspecコマンドを実行すると、このエラーが生成されます->「そのようなファイルをロードできません--rails_helper」

ここで、端末でこのコマンドを実行します。

バンドルインストール

bundleコマンドがうまくいったら、railsgenerateを実行します。そのようです、

railsはrspec:installを生成します

理由:このコマンドは、新しい.rspec(プロンプトが表示されたら上書きをヒット)、spec /rails_helper.rbおよびspec / spec_helper.rbを作成します

さて、この時点で、rspecはほぼ正しく実行されるはずです。
ただし、モデル内にそのようなファイルを読み込めないなどのエラーが発生した場合は、spec /spec_helper.rbの上にこれを追加してみてください。

require 'rubygems'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)

理由: spec_helperがRails環境をロードしていないようです。私たちはそれを要求しています。

お役に立てれば!


2

このスレッドが作成されてから少し動きましたuninitialized constant ClassName (NameError)。Ruby2.1、Rails 4.2、rspec-rails3.3を使用してもエラーが発生しました。

rspec-rails gemのドキュメントを読んで問題を解決しました:

https://github.com/rspec/rspec-rails#model-specs

ここで、Swardsが「spec_helper」ではなく「rails_helper」を要求することについて述べていることを確認します。

また、私のモデル仕様は、gemドキュメントの仕様に似ています。

RSpec.describe Url, :type => :model do
    it 'is invalid without first_name', :focus => true do
        client = Client.new
        client.should_not be_valid
    end
end

1

工場フォルダーはアプリで定義します

FactoryBot.define do
  factory :user_params , :class => 'User' do
    username 'Alagesan'
    password '$1234@..'

  end
end

コントローラのRSpecファイル:

it 'valid params' do
  post :register, params: {:user => user_params } 
end

1

この質問の他の回答が機能しない場合は、次のことを試してください。

  • ファイル名またはクラス名にタイプミスがないか確認してください(一致している必要があります)

さもないと、

  • config/environment/test.rbファイルをチェックして、あるかどうかを確認しconfig.eager_load = false、に設定しtrueます。

そこにタイプミスがあるという問題を解決したくないので、書面による順序でチェックインする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.