web-dev-qa-db-de.com

Rspec sieht meine Modellklasse nicht. nicht initialisierter konstanter Fehler

Ich schreibe Tests für Rspec für meine Modelle in der Ruby on Rails-Anwendung ... und erhalte diese Fehlermeldung beim Starten von 'rspec spec'. 

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

Ich verwende 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 zuletzt 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 spec_helper.rb Datei:

# 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
70
Stan

In Ihrer spec_helper-Datei fehlen einige wichtige Befehle. Konkret beinhaltet es nicht config/environment und initialisiert rspec-Rails.

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

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

oder du kannst einfach laufen

Rails generate rspec:install

und überschreiben Sie Ihren spec_helper mit einem zur Verwendung mit rspec-Rails generierten Code.

76
gmacdougall

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

require "Rails_helper"  # this

nicht

require "spec_helper"   # not this

in Ihren Spec-Dateien

142
Mark Swardstrom

Vielleicht möchten Sie auch --require Rails_helper in Ihre .rspec-Datei einfügen, so dass es so aussieht.

--color
--require spec_helper
--require Rails_helper

Danach müssen Sie nicht mehr Rails_helper in allen Ihren Spezifikationen benötigen.

12

Ich verwende Rails 5.0.0.1.
So habe ich dieses Anliegen gelöst.

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

Wie so 

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

Grund: Wenn rspec-Rails nicht hinzugefügt wird und wenn Sie den Befehl rspec ausführen, wird dieser Fehler generiert. -> "Diese Datei kann nicht geladen werden - Rails_helper"

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

bundle installieren

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

Rails erzeugen rspec: install

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

Nun, zu diesem Zeitpunkt sollte rspec ziemlich gut laufen.
Wenn jedoch ein Fehler auftritt, der nicht im Modell enthalten ist, z. Diese Datei kann nicht geladen werden - Idee. 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: scheint, dass spec_helper die Rails-Umgebung nicht lädt. Wir brauchen es.

Hoffe das hilft!

5
Kent Aguilar

Seitdem dieser Thread erstellt wurde, hat sich etwas bewegt. Ich habe auch den Fehler uninitialized constant ClassName (NameError) mit Ruby 2.1, Rails 4.2, rspec-Rails 3.3.

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

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

dort wird bestätigt, was Swards sagt, dass "Rails_helper" nicht mehr "spec_helper" erforderlich ist.

Auch meine Modellspezifikation ähnelt eher der von den gem docs

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

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

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

Andernfalls,

  • Überprüfen Sie Ihre config/environment/test.rb-Datei...., Ob es config.eager_load = false gibt, und setzen Sie ihn auf true.

Sie sollten die schriftliche Reihenfolge überprüfen, da Sie das Problem nicht mit dem Tippfehler lösen möchten.

0
Longfei Wu

Fabriken Ordner in Ihrer App definieren

FactoryBot.define do
  factory :user_params , :class => 'User' do
    username 'Alagesan'
    password '[email protected]'

  end
end

Ihre Controller-RSpec-Datei:

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