0
首先,我會說我正在學習Ruby和TDD計劃,所以請原諒我。 Acctualy我有兩個問題彼此相關,但首先請看看這個代碼。它是我的單元測試課程的一部分:如果我們對模擬對象進行操作會發生什麼? Rspec
context 'with products' do
let(:result) { instance_double('Money', value: 20, currency: 'EUR') }
let(:xxx) { instance_double('Money', value: 10, currency: 'EUR') }
let(:money2) { instance_double('Money', value: 10, currency: 'EUR',:+ => xxx , :to_s => '10.00 EUR') }
let(:money) { instance_double('Money', value: 10, currency: 'EUR', :+ => money2, :to_s => '10.00 EUR') }
let(:product1) { instance_double('Product', price: money2) }
let(:product2) { instance_double('Product', price: money) }
let(:products) { [product1, product2] }
it 'returns sum of product prices' do
#Real objects
product1 = Product.new
product1.price = Money.new('1.23', 'EUR')
product1.name = product1
product2 = Product.new
product2.price = Money.new('1.23', 'EUR')
product2.name = product2
products1 = [product1,product2]
puts products1.map!(&:price)
#Fake
puts "fakeproducts map"
fakeproducts = products.map!(&:price)
puts fakeproducts
puts "Sum of fakeproducts"
puts Money.sum(fakeproducts)
puts Money.sum(fakeproducts).to_s
puts "methods of sum fakeproducts"
puts Money.sum(fakeproducts).methods
expect(Order.new(full_name, date, products).total_amount).to eql result
end
end
問題是我的真實對象工作,但嘲弄對象doens't。錯誤,我得到:
Failure/Error: expect(Order.new(full_name, date, products).total_amount).to eql result
Double "Money (instance)" received unexpected message :price with (no args)
TOTAL_AMOUNT功能:
def total_amount
return 0 if products.empty?
asd = products.map!(&:price)
Money.sum(asd)
end
和Money.sum看起來是這樣的:
def self.sum(moneys)
moneys.group_by(&:currency).values.map(&:sum)
end
我懷疑,當我做我的嘲笑對象的某些操作它失去了它的屬性。 問題是:
- 這是否正常發生?
- 這是什麼問題的解決方案?我應該嘲笑我的功能的結果?