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

Sta*_*tan 81 testing rspec model ruby-on-rails

我正在为Ruby on Rails应用程序中的模型编写Rspec测试.我在启动'rspec spec'时收到此错误

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

我使用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
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

最后是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
Run Code Online (Sandbox Code Playgroud)

如果它有用我的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
Run Code Online (Sandbox Code Playgroud)

Mar*_*rom 148

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

require "rails_helper"  # this
Run Code Online (Sandbox Code Playgroud)

require "spec_helper"   # not this
Run Code Online (Sandbox Code Playgroud)

在您的spec文件中

  • 出于谷歌搜索的目的,这应该是它自己的问题;我一直在努力解决我认为损坏的 Capybara、损坏的launchy 或损坏(填写宝石)的问题,这完全是由于这一行更改。 (2认同)

gma*_*all 86

您的spec_helper文件缺少一些重要命令.具体来说,它不包括配置/环境和初始化rspec-rails.

您可以将以下行添加到spec/spec_helper.rb文件的开头

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

或者你可以跑

rails generate rspec:install
Run Code Online (Sandbox Code Playgroud)

spec_helper使用生成的一个覆盖您的rspec-rails.

  • 较新版本的RSpec将一些东西从`spec/spec_helper.rb`文件移出,所以现在你也得到一个`spec/rails_helper.rb`文件.如果你运行`rails generate rspec:install`,[这就是它产生的](http://pastie.org/9280896)(rspec-rails 3.0.1,rails 4.1.1).原来`rails_helper.rb`文件包含一些与你类似的代码,当你想在规范中加载Rails时应该是必需的. (29认同)
  • 如果你想自动包含`spec/rails_helper.rb`你可以在你的`.spec`中添加`--require rails_helper` (20认同)
  • 但是没有将`--require rails_helper`添加到`.rspec`会破坏两个助手的分离点.我认为你总是会加载rails_helper(因此也就是Rails),即使对于不需要Rails的规范也是如此. (3认同)

Uma*_*shi 15

您可能还想--require rails_helper.rspec文件中添加它,使其看起来像这样.

--color
--require spec_helper
--require rails_helper
Run Code Online (Sandbox Code Playgroud)

在此之后,您不需要在所有规范中要求rails_helper.

  • 如果您需要为每个测试加载Rails环境,这很好,但如果不是这样,最终会导致测试套件比它需要的速度慢,正如一些人在上面另一个答案的评论中提到的那样. (2认同)

Lon*_* Wu 10

如果此问题下的其他答案不起作用,请尝试:

  • 检查文件名或类名是否有拼写错误(它们应该匹配)

否则,

  • 检查你的config/environment/test.rb文件,看看是否有config.eager_load = false,将其设置为true.

您应该检查书面订单,因为您不想通过其中的拼写错误来解决问题。


L.Y*_*oul 6

上面的答案对我来说都不是很切中要害,或者对于需要放置代码行的位置不够明确。我正在使用 Rails 6.0.2 和 rspec-rails 4.1.0 并发现两个选项可以解决该问题。

  1. 将该行添加require 'rails_helper'到需要运行的每个规范文件的顶部。

  2. 将这一行添加require 'rails_helper'到文件顶部spec/spec_helper.rb以使 Rails 帮助程序文件在所有测试中可用。


Ken*_*lar 5

我正在使用Rails 5.0.0.1.
以下是我如何解决这个问题.

在你的Gemfile上,请添加 - > gem'rspec -rails',"> = 2.0.0.beta"

像这样,

group :development, :test do
  gem 'rspec-rails', ">= 2.0.0.beta"
end
Run Code Online (Sandbox Code Playgroud)

原因:如果未添加rspec-rails并执行rspec命令,则会生成此错误 - > "无法加载此类文件 - rails_helper"

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

捆绑安装

一旦bundle命令运行良好,执行rails generate.像这样,

rails生成rspec:install

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

现在,在这一点上,rspec应该运行得很好.
但是,如果您在模型中找不到错误,例如无法加载此类文件,请尝试在spec/spec_helper.rb上添加此错误

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

原因:似乎spec_helper没有加载Rails环境.我们要求它.

希望这可以帮助!