我跑在rspec的集成測試和測試不斷billed_for
扔了一個未定義的方法:未定義的方法在RSpec的測試
「未定義的方法billed_for
零:NilClass」
require 'user'
describe "Integration" do
let(:user) { User.new(voucher) }
context 'no voucher' do
let(:voucher) { nil }
it 'should bill default price all the time' do
user.bill
expect(user.orders[0].billed_for).to eql 6.95
end
end
end
我有一個非常小的用戶類到目前爲止
require 'order'
require 'voucher'
class User
attr_accessor :voucher, :orders
def initialize(orders = [], voucher = nil)
@voucher = voucher
@orders = [orders]
end
def bill
new_order = Order.new(self)
@orders << new_order
end
end
和同樣小訂單類:
class Order
DEFAULT_PRICE = 6.95
attr_accessor :user
def initialize(user)
@user = user
end
def billed_for
price = DEFAULT_PRICE
user.orders.each do |order|
price - order.billed_for
end
price
end
end
什麼是最困惑我是這一行
user.orders[0].billed_for
時,我認爲它通過一個新的用戶級設置這讓我再訪問訂單哈希在用戶的散列然後我訪問訂單類中的billed_for
方法。
當我GOOGLE了這個問題,它指向使用self關鍵字不工作。
如果有人能在正確的方向指向我,這簡直太好
編輯:
雅各布小號親切指着我的測試,因爲在我的陣列零條目的失敗。
對此的快速修復只是爲了運行緊湊的功能來刪除無條目。
總是打開更好的解決方案。
編輯2:
let(:user) { User.new(voucher) }
context 'no voucher' do
let(:voucher) { nil }
it 'should bill default price all the time' do
user.bill
expect(user.orders[0].billed_for).to eql 6.95
... ...
end
end
context 'vouchers' do
describe 'default vouchers' do
let(:voucher) { Voucher.create(:default, credit: 15) }
it 'should not bill user if has a remaining credit' do
user.bill
expect(user.orders[0].billed_for).to eql 0.0
... ...
end
end
感謝您的幫助迄今。我還開了一個額外的線程,因爲我有一些其他類似的問題
Accessing variables of other classes
在測試中是否曾經傳遞給''用戶'初始化方法?似乎初始化應該將其設置爲一個空數組,而不是傳入值? – house9
我已經添加了一個測試流程的例子!它看起來像訂單隻有用戶類啓動 – user3750194