Rspec nie widzi mojego modelu Class. niezainicjowany stały błąd

86

Piszę testy na Rspec dla moich modeli w aplikacji Ruby on Rails. Otrzymuję ten błąd podczas uruchamiania 'rspec spec'

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

Używam Rails 4.0.0 i Ruby 2.0.0

Oto mój 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

I 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

I wreszcie client.rb (model i klasa 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

Jeśli przydałby się mój plik 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
źródło
To, co zadziałało, to usunięcie linii --require spec_helperz .rspec. Jak już zawierał --require rails_helper, który był ładowany po spec_helper.
Yuri Ghensev

Odpowiedzi:

91

W Twoim spec_helperpliku brakuje niektórych ważnych poleceń. W szczególności nie obejmuje konfiguracji / środowiska i inicjalizacji rspec-rails.

Możesz dodać następujące wiersze na początku spec/spec_helper.rbpliku

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

albo możesz po prostu biec

rails generate rspec:install

i nadpisz swój spec_helperwygenerowany do użytku z rspec-rails.

gmacdougall
źródło
30
Nowsze wersje RSpec przenoszą niektóre rzeczy z spec/spec_helper.rbpliku, więc teraz otrzymujesz również spec/rails_helper.rbplik. Jeśli uruchomisz rails generate rspec:install, to właśnie produkuje (rspec-rails 3.0.1, rails 4.1.1). Okazuje się, że rails_helper.rbplik zawiera kod podobny do twojego i powinien być wymagany, gdy chcesz załadować Railsy do specyfikacji.
Dennis
Dennis jest na dobrej drodze. Uważam, że konfigurację testów, które będą testować możliwości Railsów, należy przenieść z spec_helper.rbdo rails_helper.rb. Przeczytaj również komentarze w rails_helper.rbtej wzmiance, jak to rspec-railszrobić infer_spec_type_from_file_location, co może spowodować przeniesienie testów specyfikacji do różnych spec/*/podkatalogów.
Stephen Henderson
21
jeśli chcesz dołączyć spec/rails_helper.rbautomatycznie, możesz to zrobić w swoim .rspec, dodając--require rails_helper
schmijos
3
Ale nie przyczynia się --require rails_helperdo .rspecpokonania punktu oddzielenia dwóch pomocników. Myślę, że wtedy zawsze będziesz ładował rails_helper (a tym samym Railsy), nawet dla specyfikacji, które nie wymagają Rails.
Jon Garvin,
To bardzo pomogło. Właściwie musiałem zaktualizować mój .travis.ymldobin/rspec
Peter Ehrlich
156

W rails 4.x (rspec-rails 3.1.0) użyj

require "rails_helper"  # this

nie

require "spec_helper"   # not this

w plikach specyfikacji

Mark Swardstrom
źródło
2
To powinno być gdzieś własne pytanie do celów Google; Zmagałem się z tym, co uważałem za zepsutą Kapibarę, zepsuty starter lub zepsuty (uzupełnij klejnot) i to wszystko z powodu tej jednej zmiany linii.
EthanK
wymagają pracy "rails_helper" na szynach 3.2.22 (rspec-rails 3.2.1)
shilovk
To było bardzo zagmatwane. Buduję nową aplikację Rails 6 i uruchamiam moją pierwszą specyfikację. Na pewno ładował plik rails_helper.rb, ale teraz widzę, że próbował go załadować po próbie uruchomienia specyfikacji. Dodano require "rails_helper"do górnej części mojej specyfikacji i byłem gotowy.
Travis
19

Możesz również dodać --require rails_helperdo swojego .rspecpliku, aby wyglądał tak.

--color
--require spec_helper
--require rails_helper

Po tym nie będziesz musiał wymagać rails_helper we wszystkich swoich specyfikacjach.

Umang Raghuvanshi
źródło
2
Jest to świetne, jeśli musisz ładować środowisko Rails dla każdego testu, ale jeśli nie, to ostatecznie spowoduje, że twój zestaw testów będzie wolniejszy niż powinien, jak niektórzy wspomnieli w komentarzach do innej odpowiedzi powyżej.
jamesmarkcook
8

Używam Rails 5.0.0.1.
Oto, jak rozwiązałem ten problem.

Dodaj do swojego pliku Gemfile -> gem 'rspec-rails', "> = 2.0.0.beta"

Tak jak tak

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

Powód: jeśli rspec-rails nie zostanie dodany i kiedy wykonasz polecenie rspec, wygeneruje ten błąd -> "nie można załadować takiego pliku - rails_helper"

Teraz wykonaj to polecenie na terminalu.

instalacja pakietu

Gdy polecenie pakietu poszło dobrze, wykonaj generowanie szyn. Tak jak tak

railsy generują rspec: install

Powód: to polecenie utworzy nowy plik .rspec (naciśnij nadpisanie po wyświetleniu monitu), spec / rails_helper.rb i spec / spec_helper.rb

W tym momencie rspec powinien działać poprawnie.
Jeśli jednak napotkasz błąd polegający na tym, że w modelu nie znaleziono, np. Nie możesz załadować takiego pliku - pomysł , spróbuj dodać go na górze specyfikacji / spec_helper.rb

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

Powód: wydaje się, że spec_helper nie ładuje środowiska Railsów. Wymagamy tego.

Mam nadzieję że to pomoże!

Kent Aguilar
źródło
2

Od czasu utworzenia tego wątku uninitialized constant ClassName (NameError)sytuacja trochę się zmieniła. Wystąpił również błąd podczas używania Ruby 2.1, Rails 4.2, rspec-rails 3.3.

Rozwiązałem swoje problemy z czytaniem dokumentacji gemów rspec-rails:

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

gdzie potwierdza to, co mówi Swards o wymaganiu "rails_helper", a nie "spec_helper".

Również specyfikacja mojego modelu wygląda bardziej jak ta z dokumentacji 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
Arnaud Bouchot
źródło
1

Folder fabryk zdefiniowany w Twojej aplikacji

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

  end
end

Plik RSpec kontrolera:

it 'valid params' do
  post :register, params: {:user => user_params } 
end
Boobalan
źródło
1

Jeśli inne odpowiedzi na to pytanie nie działają, spróbuj:

  • Sprawdź, czy nie ma błędów w nazwie pliku lub nazwie klasy (powinny być zgodne)

Inaczej,

  • Sprawdź swój config/environment/test.rbplik, zobacz, czy jest config.eager_load = false, ustaw go na true.

Powinieneś sprawdzić w pisemnym zamówieniu, ponieważ nie chcesz rozwiązać problemu z literówką.

Longfei Wu
źródło