2014-11-16 27 views
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 

我懷疑,當我做我的嘲笑對象的某些操作它失去了它的屬性。 問題是:

  1. 這是否正常發生?
  2. 這是什麼問題的解決方案?我應該嘲笑我的功能的結果?

回答

1

你在total_amount使用map!的重挫與訂單相關聯的products,與他們的價格替換它們,以便下次你打電話price對訂單的產品時(例如,在以total_amount的後續調用)您正在將price發送給您的金錢雙打之一。

您可以在total_amount的內部使用map而不是map!來避免這種特殊症狀。

作爲一個相關方面,如果您爲堆棧跟蹤提供錯誤並在代碼中識別相應的源代碼行,那麼爲這些類型的問題提供幫助就容易得多。

相關問題