2014-11-16 3 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 

Проблема в том, что мои настоящие объекты работают, но издеваются над объектами. Ошибка, которую я получил: функцию

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

Использование map! в total_amount является сбивание в products, связанный с заказом, заменив их цене, так что в следующий раз, когда вы звоните price на продукты ордена (например, как в последующем вызове total_amount), вы отправляете price в один из своих двухместных номеров.

Вы можете избежать этого конкретного симптома, используя map вместо map! внутри total_amount.

Как связанная сторона, гораздо проще предоставить помощь по этим вопросам, если вы предоставите трассировку стека с ошибкой и определите соответствующие исходные строки в коде.

Смежные вопросы