Ruby on rails Rspec不';我看不到我的模型课。未初始化常量错误

Ruby on rails Rspec不';我看不到我的模型课。未初始化常量错误,ruby-on-rails,testing,model,rspec,Ruby On Rails,Testing,Model,Rspec,我正在RubyonRails应用程序中为我的模型编写Rspec测试。 我在启动“rspec spec”时收到此错误 command: /spec/models/client_spec.rb:4:in `<top (required)>': uninitialized constant Client (NameError) 及档案: source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', git

我正在RubyonRails应用程序中为我的模型编写Rspec测试。 我在启动“rspec spec”时收到此错误

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

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模型和类):


您的
spec\u helper
文件缺少一些重要命令。具体来说,它不包括config/environment和初始化
rspec-rails

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

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
或者你可以直接跑

rails generate rspec:install
并使用为rails 4.x(rspec rails 3.1.0)中的
rspec rails
使用而生成的
spec\u助手
覆盖您的

不是


在您的spec文件中,自从创建这个线程以来,事情发生了一些变化,我在使用Ruby 2.1、Rails 4.2、rspec Rails 3.3时也遇到了
未初始化常量类名(NameError)
错误

我已经解决了阅读rspec rails gem文档时遇到的问题:

它证实了Swards关于要求“rails\u helper”而不是“spec\u 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

您可能还希望在
.rspec
文件中添加
--require rails\u helper
,使其看起来像这样

--color
--require spec_helper
--require rails_helper

在此之后,您不需要在所有规格中都使用rails\u helper。

我使用的是rails 5.0.0.1。
下面是我如何解决这个问题的

请在gem文件中添加->gem'rspec rails',“>=2.0.0.beta”

这样,

group :development, :test do
  gem 'rspec-rails', ">= 2.0.0.beta"
end
原因:如果未添加rspec rails,并且在执行rspec命令时,它将生成此错误->“无法加载此文件--rails\u helper”

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

捆绑安装

一旦bundle命令运行正常,就执行railsgenerate命令。这样,

rails生成rspec:install

原因:此命令将创建一个新的.rspec(提示时点击覆盖)、spec/rails\u helper.rb和spec/spec\u helper.rb

require 'rubygems'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
现在,rspec应该可以正常运行了。
但是,如果您遇到模型中找不到的错误,例如无法加载此类文件--idea,请尝试将其添加到spec/spec_helper.rb的顶部

require 'rubygems'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
原因:spec\u helper似乎没有加载Rails环境。我们需要它


希望这有帮助

在应用程序中定义工厂文件夹

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

如果此问题下的其他答案无效,请尝试:

  • 检查文件名或类名是否有任何输入错误(它们应该匹配)
换句话说

  • 检查您的
    config/environment/test.rb
    文件, 查看是否存在
    config.eager\u load=false
    ,将其设置为
    true

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

上面的答案对我来说都不是一针见血的,或者对需要放置代码行的位置不够明确。我正在使用rails 6.0.2和rspec rails 4.1.0,并找到了两个解决问题的选项

  • 将行
    require'rails\u helper'
    添加到需要运行的每个规范文件的顶部

  • 将行
    require'rails\u helper'
    添加到
    spec/spec\u helper.rb
    文件的顶部,以使rails helper文件在所有测试中都可用


  • 较新版本的RSpec从
    spec/spec\u helper.rb
    文件中删除了一些内容,因此现在您还得到了一个
    spec/rails\u helper.rb
    文件。如果运行
    rails,则生成rspec:install
    ,(rspec-rails 3.0.1,rails 4.1.1)。事实证明,
    rails\u helper.rb
    文件包含一些与您的代码类似的代码,并且当您希望在您的规范中加载rails时,应该需要这些代码。Dennis是正确的。我认为测试Rails功能的测试的配置应该从
    spec\u helper.rb
    转移到
    Rails\u helper.rb
    。另外,请务必阅读
    rails\u helper.rb
    中的注释,其中提到
    rspec rails
    如何从文件位置推断规范类型,这可能会使您将规范测试重新定位到不同的
    spec/*/
    子目录中。如果您想自动将
    spec/rails\u helper.rb
    包含在
    中,您可以通过添加
    --require rails\u helper
    而不是将
    --require rails\u helper
    添加到
    中来实现。rspec
    克服了这一点把两个助手分开。我想你会一直在加载rails\uHelper(因此也会加载rails),即使是不需要rails的规范。这帮了大忙。实际上,我需要将我的
    .travis.yml
    更新为
    bin/rspec
    ,这应该是谷歌自己的问题;我一直在努力解决我认为是坏的水豚,或坏的启动,或坏的(填写宝石),这都是由于这一行的变化。需要“rails\u助手”工作在rails 3.2.22(rspec rails 3.2.1)这是超级混乱。我正在构建一个新的Rails 6应用程序并运行我的第一个规范。它肯定是在加载Rails\u helper.rb文件,但我现在看到它在尝试运行规范后尝试加载它。在我的规范顶部添加了
    require“Rails\u helper”
    ,我很乐意。如果每次测试都需要加载Rails环境,这非常好,但如果不是这样,这最终会导致您的测试套件比需要的慢,正如上面另一个答案的评论中所提到的。对我来说,有效的方法是从
    .rspec
    中删除行
    --require spec\u helper
    。因为它已经包含了
    ——require rails\u helper
    ,它是在
    spec\u helper
    之后加载的。
    group :development, :test do
      gem 'rspec-rails', ">= 2.0.0.beta"
    end
    
    require 'rubygems'
    ENV["RAILS_ENV"] ||= 'test'
    require File.expand_path("../../config/environment", __FILE__)
    
    FactoryBot.define do
      factory :user_params , :class => 'User' do
        username 'Alagesan'
        password '$1234@..'
    
      end
    end
    
    it 'valid params' do
      post :register, params: {:user => user_params } 
    end