Rspec sieht meine Modellklasse nicht. nicht initialisierter konstanter Fehler

86

Ich schreibe Tests auf Rspec für meine Modelle in der Ruby on Rails-Anwendung. Und ich erhalte diesen Fehler beim Starten von 'rspec spec'

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

Ich benutze Rails 4.0.0 und Ruby 2.0.0

Hier ist meine 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

Und 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

Und endlich client.rb (ROR-Modell und Klasse):

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

Wenn es nützlich wäre, meine Datei 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
Stan
quelle
Was für mich funktionierte, war das Entfernen der Leitung --require spec_helpervon .rspec. Wie es bereits enthielt --require rails_helper, wurde das nach geladen spec_helper.
Yuri Ghensev

Antworten:

90

In Ihrer spec_helperDatei fehlen einige wichtige Befehle. Insbesondere werden Konfiguration / Umgebung und Initialisierung nicht berücksichtigt rspec-rails.

Sie können die folgenden Zeilen am Anfang Ihrer spec/spec_helper.rbDatei hinzufügen

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

oder du kannst einfach rennen

rails generate rspec:install

und überschreiben Sie Ihre spec_helpermit einer für die Verwendung mit generiert rspec-rails.

gmacdougall
quelle
30
Neuere Versionen von RSpec verschieben einige Inhalte aus der spec/spec_helper.rbDatei, sodass Sie jetzt auch eine spec/rails_helper.rbDatei erhalten. Wenn Sie ausführen rails generate rspec:install, wird dies erzeugt (rspec-Rails 3.0.1, Rails 4.1.1). Es stellt sich heraus, dass die rails_helper.rbDatei einen ähnlichen Code wie Sie enthält und erforderlich sein sollte, wenn Sie Rails in Ihre Spezifikationen laden möchten.
Dennis
Dennis ist auf dem richtigen Weg. Ich glaube, dass die Konfiguration für Tests, die Rails-Funktionen testen sollen, von spec_helper.rbin verschoben werden sollte rails_helper.rb. Lesen Sie auch die Kommentare in rails_helper.rbdieser Erwähnung, wie rspec-railsdies möglich ist. Dadurch können infer_spec_type_from_file_locationSie Ihre Spezifikationstests möglicherweise in verschiedene spec/*/Unterverzeichnisse verschieben .
Stephen Henderson
20
Wenn Sie spec/rails_helper.rbautomatisch aufnehmen möchten, können Sie dies in Ihrem tun, .rspecindem Sie--require rails_helper
schmijos
3
Aber nicht hinzufügen --require rails_helper, .rspecum den Punkt der Trennung der beiden Helfer zu besiegen. Ich denke, dann werden Sie immer rails_helper (und damit Rails) laden, auch für Spezifikationen, die keine Rails benötigen.
Jon Garvin
Das hat sehr geholfen. Ich musste mein Update tatsächlich .travis.ymlaufbin/rspec
Peter Ehrlich
154

In Schienen 4.x (rspec-Schienen 3.1.0) verwenden

require "rails_helper"  # this

nicht

require "spec_helper"   # not this

in Ihren Spezifikationsdateien

Mark Swardstrom
quelle
2
Dies sollte irgendwo eine eigene Frage für Googeln sein. Ich hatte Probleme mit dem, was ich für kaputt hielt, Capybara oder kaputt, starty oder kaputt (füllen Sie den Edelstein aus), und alles war auf diesen einen Zeilenwechsel zurückzuführen.
EthanK
erfordern "Rails_Helper" Arbeit an Rails 3.2.22 (rspec-Rails 3.2.1)
Shilovk
Das war super verwirrend. Ich baue eine neue Rails 6-App und führe meine erste Spezifikation aus. Es wurde definitiv die Datei rails_helper.rb geladen, aber ich sehe jetzt, dass versucht wurde, sie zu laden, nachdem versucht wurde, die Spezifikation auszuführen. Hinzugefügt require "rails_helper"an der Spitze meiner Spezifikation und ich war gut zu gehen.
Travis
19

Möglicherweise möchten Sie auch --require rails_helperIhre .rspecDatei hinzufügen, damit sie so aussieht.

--color
--require spec_helper
--require rails_helper

Danach müssen Sie rails_helper nicht mehr in all Ihren Spezifikationen benötigen.

Umang Raghuvanshi
quelle
2
Dies ist ideal, wenn Sie die Rails-Umgebung für jeden Test laden müssen. Andernfalls wird Ihre Testsuite möglicherweise langsamer als erforderlich, wie einige in den Kommentaren zu einer anderen Antwort oben erwähnt haben.
Jamesmarkcook
8

Ich benutze Rails 5.0.0.1.
So habe ich dieses Problem gelöst.

Fügen Sie in Ihrer Gemfile -> gem 'rspec-Rails', "> = 2.0.0.beta" hinzu.

Wie so,

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

Grund: Wenn die rspec-Rails nicht hinzugefügt werden und Sie den Befehl rspec ausführen, wird dieser Fehler generiert -> "Eine solche Datei kann nicht geladen werden - rails_helper"

Führen Sie nun diesen Befehl auf dem Terminal aus.

Bundle installieren

Sobald der Bundle-Befehl erfolgreich war, führen Sie die generierten Rails aus. Wie so,

Schienen erzeugen rspec: install

Grund: Dieser Befehl erstellt eine neue .rspec (klicken Sie auf Überschreiben, wenn Sie dazu aufgefordert werden), spec / rails_helper.rb und spec / spec_helper.rb

Jetzt, an diesem Punkt, sollte rspec so ziemlich richtig laufen.
Wenn Sie jedoch auf einen Fehler stoßen, bei dem das Modell nicht gefunden wird, z. B. eine solche Datei nicht laden kann , versuchen Sie, diese über Ihre spec / spec_helper.rb hinzuzufügen

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

Grund: Anscheinend lädt spec_helper die Rails-Umgebung nicht. Wir brauchen es.

Hoffe das hilft!

Kent Aguilar
quelle
2

Die Dinge haben sich ein wenig bewegt, seit dieser Thread erstellt wurde. Ich habe den uninitialized constant ClassName (NameError)Fehler auch bei der Verwendung von Ruby 2.1, Rails 4.2, rspec-Rails 3.3 festgestellt .

Ich habe meine Probleme beim Lesen der rspec-Rails Gem-Dokumentation gelöst:

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

Hier wird bestätigt, was Swards über das Erfordernis von "rails_helper" und nicht mehr von "spec_helper" sagt.

Auch meine Modellspezifikation ähnelt eher der aus den Gem-Dokumenten

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
Arnaud Bouchot
quelle
1

Der Ordner "Fabriken" wird in Ihrer App definiert

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

  end
end

Ihre Controller-RSpec-Datei:

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

Wenn andere Antworten unter dieser Frage nicht funktionieren, versuchen Sie:

  • Überprüfen Sie, ob der Dateiname oder der Klassenname einen Tippfehler enthält (sie sollten übereinstimmen).

Andernfalls,

  • Überprüfen Sie Ihre config/environment/test.rbDatei, prüfen Sie , ob sie vorhanden ist config.eager_load = false, und setzen Sie sie auf true.

Sie sollten die schriftliche Reihenfolge einchecken, da Sie das Problem mit dem dort liegenden Tippfehler nicht lösen möchten.

Longfei Wu
quelle