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
ruby-on-rails
testing
model
rspec
Stan
źródło
źródło
--require spec_helper
z.rspec
. Jak już zawierał--require rails_helper
, który był ładowany pospec_helper
.Odpowiedzi:
W Twoim
spec_helper
pliku brakuje niektórych ważnych poleceń. W szczególności nie obejmuje konfiguracji / środowiska i inicjalizacjirspec-rails
.Możesz dodać następujące wiersze na początku
spec/spec_helper.rb
plikuENV["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_helper
wygenerowany do użytku zrspec-rails
.źródło
spec/spec_helper.rb
pliku, więc teraz otrzymujesz równieżspec/rails_helper.rb
plik. Jeśli uruchomiszrails generate rspec:install
, to właśnie produkuje (rspec-rails 3.0.1, rails 4.1.1). Okazuje się, żerails_helper.rb
plik zawiera kod podobny do twojego i powinien być wymagany, gdy chcesz załadować Railsy do specyfikacji.spec_helper.rb
dorails_helper.rb
. Przeczytaj również komentarze wrails_helper.rb
tej wzmiance, jak torspec-rails
zrobićinfer_spec_type_from_file_location
, co może spowodować przeniesienie testów specyfikacji do różnychspec/*/
podkatalogów.spec/rails_helper.rb
automatycznie, możesz to zrobić w swoim.rspec
, dodając--require rails_helper
--require rails_helper
do.rspec
pokonania 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..travis.yml
dobin/rspec
W rails 4.x (rspec-rails 3.1.0) użyj
require "rails_helper" # this
nie
require "spec_helper" # not this
w plikach specyfikacji
źródło
require "rails_helper"
do górnej części mojej specyfikacji i byłem gotowy.Możesz również dodać
--require rails_helper
do swojego.rspec
pliku, aby wyglądał tak.--color --require spec_helper --require rails_helper
Po tym nie będziesz musiał wymagać rails_helper we wszystkich swoich specyfikacjach.
źródło
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.
Gdy polecenie pakietu poszło dobrze, wykonaj generowanie szyn. Tak jak tak
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!
źródło
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
źródło
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
źródło
Jeśli inne odpowiedzi na to pytanie nie działają, spróbuj:
Inaczej,
config/environment/test.rb
plik, zobacz, czy jestconfig.eager_load = false
, ustaw go natrue
.Powinieneś sprawdzić w pisemnym zamówieniu, ponieważ nie chcesz rozwiązać problemu z literówką.
źródło