【问题标题】:`<main>': uninitialized constant RSpec (NameError) using when testing Ruby files`<main>': 测试 Ruby 文件时使用的未初始化常量 RSpec (NameError)
【发布时间】:2015-08-19 03:02:47
【问题描述】:

我查看了几篇有关此问题的帖子,但似乎找不到解决方法。我目前正在完成 Ruby on Rails 开发课程中的一项作业,我们已经使用 RSpec 完成了一个关于 TDD/BDD 的模块。到目前为止,我已经取得了一些成功,但我无法弄清楚如何处理这个错误:

&lt;main&gt;': uninitialized constant RSpec (NameError)

我已经逐行检查了我的期望和代码本身,以确保它是正确的。 RSpec 在规范文件中正确大写,我有一个带有相应end 的类,这通常会导致 RSpec 抛出此错误。不过,我仍在学习 RSpec。当错误开始弹出时,我正在处理最后一个期望声明。

代码

require_relative "entry.rb"

class AddressBook
attr_accessor :entries

  def initialize
   @entries = []
  end

  def add_entry(name, phone, email)
   index = 0
   @entries.each do |entry| 
     if name < entry.name
       break
      end
      index += 1
     end
    @entries.insert(index, Entry.new(name, phone, email))
  end

  def remove_entry

  end
end

RSpec

RSpec.describe AddressBook do  
   context "attributes" do
     it "should respond to entries" do
       book = AddressBook.new
       expect(book).to respond_to(:entries)
     end

     it "should initialize entries as an array" do
       book = AddressBook.new
       expect(book.entries).to be_a(Array)
     end

     it "should initialize entries as empty" do
       book = AddressBook.new
       expect(book.entries.size).eql? 0
     end
   end

   context ".add_entry" do
     it "adds only one entry to the address book" do 
       book = AddressBook.new     
       book.add_entry('Ada Lovelace', '010.012.1815', 'augusta.king@lovelace.com')

        expect(book.entries.size).eql? 1
     end

     it "adds the correct information to entries" do
       book = AddressBook.new     
       book.add_entry('Ada Lovelace', '010.012.1815', 'augusta.king@lovelace.com')
       new_entry = book.entries[0]

       expect(new_entry.name).eql? 'Ada Lovelace'
       expect(new_entry.phone_number).eql? '010.012.1815'
       expect(new_entry.email).eql? 'augusta.king@lovelace.com'
     end
   end
     it "removes only one entry from the address book" do
     book = AddressBook.new

    expect(book.entries.size).to change.by(1)
  end
 end

更新

我运行 rspec spec/address_book_specs.rb 作为下面所述的答案并收到以下信息:

/Users/jrshafer/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in     `require': cannot load such file -- spec_helper.rb (LoadError)
    from /Users/jrshafer/.rvm/rubies/ruby-    2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in     `require'
    from /Users/jrshafer/bloc/code/address-bloc/spec/address_book_specs.rb:1:in `<top (required)>'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/lib/rspec/core/configuration.rb:1226:in `load'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/lib/rspec/core/configuration.rb:1226:in `block in load_spec_files'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/lib/rspec/core/configuration.rb:1224:in `each'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/lib/rspec/core/configuration.rb:1224:in `load_spec_files'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:97:in `setup'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:85:in `run'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:70:in `run'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/lib/rspec/core/runner.rb:38:in `invoke'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/gems/rspec-core-3.2.3/exe/rspec:4:in `<top (required)>'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/bin/rspec:23:in `load'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/bin/rspec:23:in `<main>'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `eval'
    from /Users/jrshafer/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `<main>'

我发誓我以前运行这样的测试绝对没有问题。我已经重新开始了这个项目,因为我没有深入了解它并且我遇到了同样的问题。

【问题讨论】:

  • 你使用什么命令来运行测试?
  • 来自父目录:rspec spec/address_book__specs.rb models/address_book.rb
  • 我已经回复了。

标签: ruby rspec tdd bdd


【解决方案1】:

如果您是通过网络搜索来到这里的,请试试这个。将这些条目中的第一个,然后是两个条目都插入到您的 /.rspec 文件中:

--require spec_helper.rb
--require rails_helper.rb

也许它在调试您的问题时抖出附加信息。

【讨论】:

    【解决方案2】:

    您的规范文件应该需要 spec_helper,以及您正在测试的类的文件:

    require "spec_helper"
    require_relative "../../lib/address_book" # Please update this accordingly
    
    RSpec.describe AddressBook do  
      context "attributes" do
        it "should respond to entries" do
          book = AddressBook.new
          expect(book).to respond_to(:entries)
      end
      # ...
    end
    

    【讨论】:

    • 进行了您建议的更改并收到以下错误:/Users/jrshafer/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require .rb:54:in `require': 无法从 /Users/jrshafer/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems 加载此类文件 - spec_helper.rb (LoadError) /core_ext/kernel_require.rb:54:in require' from specs/address_book_specs.rb:1:in
    • 你有没有在你的项目目录中初始化 RSpec(使用命令rspec --init)?
    • 是的。再次运行命令显示 .rspec 和 spec/spec_helper.rb 已经存在。
    • 从您提供的错误来看,您的规格位于 specs/ 而不是 spec/ 中。你能把它移到RSpec生成的目录吗?
    • 我得到相同的结果,有和没有require "rspec_helper"
    【解决方案3】:

    从父目录:rspec spec/address_book__specs.rb models/address_book.rb

    您试图在此处运行两个文件,但只有一个是测试文件。您只需要:

    rspec spec/address_book__specs.rb

    【讨论】:

    • 我不需要包含我正在测试的文件吗?
    • 是的。但正如 Paweł 所示,这通常是通过要求规范中的文件来完成的。
    【解决方案4】:

    感谢 slack 上的本地开发聊天的一些帮助,我能够找到解决问题的方法:

    我将所有规范文件移到规范文件夹中。在spec/entry_specs 第2 行更改为require_relative "../models/entry.rb"

    models/entry.rb 为空。给它一个空的class Entry; end。将entry_specs.rb 重命名为entry_spec.rb,这样我就可以运行rspec,不带任何参数来运行该规范。

    特别感谢 midwestdevchat 的 extensil 和 nickveys 在这方面帮助我。我要给自己订一些披萨庆祝一下。

    【讨论】:

      猜你喜欢
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      相关资源
      最近更新 更多