Rspec没有看到我的模型Class。未初始化的常量错误


86

我正在Ruby on Rails应用程序中针对我的模型在Rspec上编写测试。并且在启动“ rspec spec”时收到此错误

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

我使用Rails 4.0.0和Ruby 2.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

Answers:


91

您的spec_helper文件缺少一些重要命令。具体来说,它不包括config / environment和Initialization 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.rbrails_helper.rb。另外,请务必阅读以下内容中的评论rails_helper.rb提及如何rspec-railsinfer_spec_type_from_file_location,这可能使你重新定位你的天赋测试分为不同的spec/*/子目录。
斯蒂芬·亨德森2014年

21
如果您想spec/rails_helper.rb自动添加,可以在.rspec添加通过添加--require rails_helper
schmijos

3
但是,这并没有--require rails_helper消除.rspec分离两个助手的观点。我认为,即使对于不需要Rails的规范,您也将始终加载rails_helper(因此也将加载Rails)。
乔恩·加文2014年

这很有帮助。我实际上需要更新.travis.ymlbin/rspec
Peter Ehrlich 2015年

155

在rails 4.x(rspec-rails 3.1.0)中使用

require "rails_helper"  # this

require "spec_helper"   # not this

在您的规格文件中


2
出于谷歌搜索目的,这应该是一个问题。我一直在为自己认为损坏的水豚,破碎的发射器或破碎的东西(填满宝石)而苦苦挣扎,这全都归因于这一行的改变。
EthanK

需要在rails 3.2.22(rspec-rails 3.2.1)上进行“ rails_helper”工作
shilovk 2015年

这真是令人困惑。我正在构建一个新的Rails 6应用程序并运行我的第一个规范。肯定是在加载rails_helper.rb文件,但是我现在看到它在尝试运行规范后正在尝试加载它。添加require "rails_helper"到我的规格的顶部,我很高兴。
特拉维斯

19

你可能还喜欢添加--require rails_helper在你的.rspec文件,以便它看起来像这样。

--color
--require spec_helper
--require rails_helper

在此之后,您将不需要所有规格的rails_helper。


2
如果您需要为每个测试加载Rails环境,那就太好了,但是如果不这样做,最终将导致您的测试套件比需要的慢,就像上面另一个答案的评论中提到的那样。
jamesmarkcook '16

8

我正在使用Rails 5.0.0.1。
这是我解决此问题的方法。

在您的Gemfile上,请添加-> -rails',“> = 2.0.0.beta”

像这样

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

原因:如果未添加rspec-rails,并且在执行rspec命令时,它将生成此错误-> “无法加载此类文件-rails_helper”

现在,在终端上执行此命令。

捆绑安装

一旦bundle命令执行良好,就执行rails生成。像这样

Rails生成rspec:install

原因:此命令将创建一个新的.rspec(在出现提示时单击覆盖),spec / rails_helper.rb和spec / spec_helper.rb

现在,此时,rspec应该可以正常运行了。
但是,如果遇到找不到模型的错误,例如无法加载此类文件-idea,请尝试将其添加到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)也使用Ruby 2.1,Rails 4.2,rspec-rails 3.3遇到了错误。

我已阅读rspec-rails gem文档解决了我的问题:

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

它证实了Swards关于不再需要“ rails_helper”而不是“ spec_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

您应该按照书面顺序进行检查,因为您不想在那里打错字来解决问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.