为什么我在RSpec测试中收到加载错误?

时间:2015-06-10 03:17:30

标签: ruby-on-rails ruby csv rspec

运行RSpec测试时收到以下加载错误:

Eric-Parks-MacBook-Pro-2:Address_Bloc ericpark$ rspec spec/address_book_spec.rb models/address_book.rbrspec spec/address_book_spec.rb models/address_book.rb
/Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1226:in `load': cannot load such file -- /Users/ericpark/rails_projects/Address_Bloc/models/address_book.rbrspec (LoadError)
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1226:in `block in load_spec_files'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1224:in `each'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1224:in `load_spec_files'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/runner.rb:97:in `setup'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/runner.rb:85:in `run'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/runner.rb:70:in `run'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/runner.rb:38:in `invoke'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/exe/rspec:4:in `<top (required)>'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/bin/rspec:23:in `load'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/bin/rspec:23:in `<main>'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/bin/ruby_executable_hooks:15:in `eval'
    from /Users/ericpark/.rvm/gems/ruby-2.2.0/bin/ruby_executable_hooks:15:in `<main>'

我不确定发生加载错误的方式和原因?以下是我的一些代码:

address_book_spec.rb:

RSpec.describe AddressBook do #describe the specific MVC architecture
  let(:book) { AddressBook.new } #Instantiates book as AddressBook.new removing the need to continually call it

  def check_entry(entry, expected_name, expected_number, expected_email)
    expect(entry.name).to eql expected_name
    expect(entry.phone_number).to eql expected_number
    expect(entry.email).to eql expected_email
  end

  context "attributes" do #RSpec paradigm to name the test
    it "should respond to entries" do #RSpec paradigm to describe the function
      expect(book).to respond_to(:entries) #Actual code that runs
    end
    it "should initialize entries as an array" do
       expect(book.entries).to be_a(Array)
     end

     it "should initialize entries as empty" do
       expect(book.entries.size).to eq 0
     end
  end

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

      expect(book.entries.size).to eq 1
    end

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

       expect(new_entry.name).to eq 'Ada Lovelace'
       expect(new_entry.phone_number).to eq '010.012.1815'
       expect(new_entry.email).to eq 'augusta.king@lovelace.com'
    end
  end

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

      book.remove_entry('augusta.king@lovelace.com')
      expect(book.entries.size).to eq(0)
    end
  end

  context ".import_from_csv" do
     it "imports the correct number of entries" do
       book.import_from_csv("entries.csv")
       book_size = book.entries.size
       expect(book_size).to eql 5
     end

     it "imports the 1st entry" do
       book.import_from_csv("entries.csv")
       entry_one = book.entries[0]
       check_entry(entry_one, "Bill", "555-555-5555", "bill@blocmail.com")
     end

     it "imports the 2nd entry" do
       book.import_from_csv("entries.csv")
       entry_two = book.entries[1]
       check_entry(entry_two, "Bob", "555-555-5555", "bob@blocmail.com")
    end

     it "imports the 3rd entry" do
       book.import_from_csv("entries.csv")
       entry_three = book.entries[2]
       check_entry(entry_three, "Joe", "555-555-5555", "joe@blocmail.com")
     end

     it "imports the 4th entry" do
       book.import_from_csv("entries.csv")
       entry_four = book.entries[3]
       check_entry(entry_four, "Sally", "555-555-5555", "sally@blocmail.com")
     end

     it "imports the 5th entry" do
       book.import_from_csv("entries.csv")
       entry_five = book.entries[4]
       check_entry(entry_five, "Sussie", "555-555-5555", "sussie@blocmail.com")
     end
   end

   context ".import_from_csv2" do
      it "imports the correct number of entries" do
        book.import_from_csv("entries_2.csv")
        book_size = book.entries.size
        expect(book_size).to eql 3
      end

      it "imports the 1st entry" do
        book.import_from_csv("entries_2.csv")
        entry_one = book.entries[0]
        check_entry(entry_one, "Eric", "111-111-1111", "example1@blocmail.com")
      end

      it "imports the 2nd entry" do
        book.import_from_csv("entries_2.csv")
        entry_two = book.entries[1]
        check_entry(entry_two, "Anna", "222-222-2222", "example2@blocmail.com")
     end

      it "imports the 3rd entry" do
        book.import_from_csv("entries_2.csv")
        entry_three = book.entries[2]
        check_entry(entry_three, "Tony", "222-222-2222", "example3@blocmail.com")
      end
    end
end

address_book.rb:

require_relative "entry.rb" #Loading the model's association
require "csv"
class AddressBook
  attr_accessor :entries

  def initialize
    @entries = []
  end

  def add_entry(name, phone, email)
    #Create a variable index to store
    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 import_from_csv(file_name)
    csv_text = File.read(file_name)
    csv = CSV.parse(csv_text, headers: true)
    csv.each do |row|
      row_hash = row.to_hash
      add_entry(row_hash["name"], row_hash["phone_number"], row_hash["email"])
    end
    return csv.count
  end

  def binary_search(name)
    return nil
  end 
end

我在应用程序所在的文件夹中包含了entries.csv和entries_2.csv。

1 个答案:

答案 0 :(得分:0)

错误告诉您它无法加载您已告知要加载的特定文件。注意错误:

cannot load such file -- /Users/ericpark/rails_projects/Address_Bloc/models/address_book.rbrspec (LoadError)

注意你的rspec命令:

$ rspec spec/address_book_spec.rb models/address_book.rbrspec spec/address_book_spec.rb models/address_book.rb

您传递给rspec的第二个参数是models/address_book.rbspec,它命名一个不存在的文件。 RSpec无法加载不存在的文件,并且会发生此错误。在我看来,您可以将rspec命令简化为:

$ rspec spec/address_book_spec.rb

没有必要像你一样传递第二个spec/address_book_spec.rb arg。您也不应该将实现文件(models/address_book.rb)的路径传递给RSpec。相反,您应require 'models/address_book.rb位于spec/address_book_spec.rb的顶部。