【问题标题】:RSpec - uninitialized constant for instance doubleRSpec - 未初始化的常量,例如 double
【发布时间】:2017-12-15 21:07:38
【问题描述】:

我使用 TDD 方法使用 RSpec 构建的小型 API 出现名称错误

NameError:
  uninitialized constant ExpenseTracker::API::Ledger

API.rb

require "sinatra/base"
require "json"

module ExpenseTracker
  class API < Sinatra::Base

def initialize(ledger: Ledger.new) # default value so callers can just say API.new and get the default
  @ledger = ledger
  super() # rest of initialization from Sinatra
end

# Later, callers do this ledger: Ledger.new
app = API.new()

post '/expenses' do
  JSON.generate('expense_id' => 42)
end

get '/expenses/:date' do
  JSON.generate([])
end
end
end

api_spec.rb

require_relative "../../../app/api"
require "rack/test"

module ExpenseTracker

RecordResult = Struct.new(:success?, :expense_id, :error_message)

RSpec.describe API do
include Rack::Test::Methods

def app
  API.new(ledger: ledger)
end

let(:ledger) { instance_double('ExpenseTracker::Ledger') }

describe "POST /expense" do
  context "when the expenseis successfully recorded" do
    it 'returns the expense id'do
      allow(ledger).to receive(:record)
      .with(expense)
      .and_return(RecordResult.new(true, 417, nil))

    post '/expense', JSON.generate(expense)

    parsed = JSON.parse(last_response.body)
    expect(parsed).to include('expense_id': 417)
    end
    it 'responds with a 200 (OK)'
  end

  context "when the expense fails validation" do
    it 'returns an error message'
    it 'responds with 422 (Unprocessable entity)'
  end

end
end
end

以下是我得到的错误:

An error occurred while loading ./api_spec.rb.
Failure/Error:
  def initialize(ledger: Ledger.new) # default value so callers can just say API.new and get the default
    @ledger = ledger
    super() # rest of initialization from Sinatra
  end

NameError:
  uninitialized constant ExpenseTracker::API::Ledger

/Users/Denis/Desktop/TDD/Effective_Testing_with_Rspec3/04-acceptance-specs/expense_tracker/app/api.rb:7:in `initialize'
/Users/Denis/Desktop/TDD/Effective_Testing_with_Rspec3/04-acceptance-specs/expense_tracker/app/api.rb:13:in `<class:API>'
/Users/Denis/Desktop/TDD/Effective_Testing_with_Rspec3/04-acceptance-specs/expense_tracker/app/api.rb:5:in `<module:ExpenseTracker>'
/Users/Denis/Desktop/TDD/Effective_Testing_with_Rspec3/04-acceptance-specs/expense_tracker/app/api.rb:4:in `<top (required)>'
./api_spec.rb:1:in `require_relative'
./api_spec.rb:1:in `<top (required)>'

我错过了什么吗?我试图尝试将账本:Ledger.new 传递给 app = API.new,但没有克服这个错误。

任何帮助或想法都会很棒!

【问题讨论】:

    标签: api rspec sinatra bdd nameerror


    【解决方案1】:

    好吧,在桌子上敲了很多头之后,这个问题就解决了。

    我不得不注释掉 app = API.new,因为这还没有实现,每次我在规范中加载文件时都会出错。

    # Later, callers do this ledger: Ledger.new
    app = API.new()
    

    现在继续下一个失败的规范,哈哈!

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多