如果我们对模拟对象进行操作会发生什么? Rspec的

时间:2014-11-16 11:13:16

标签: ruby unit-testing rspec

口渴我会说我学习Ruby和TDD程序,所以请原谅我。 Acctualy我有两个相互关联的问题,但是请多看看这段代码。它是我的班级单元测试的一部分:

  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 个答案:

答案 0 :(得分:1)

您在map!中使用total_amount会破坏与订单相关联的products,并将其替换为价格,以便您下次拨打price时订单的产品(例如,在随后的total_amount调用中),您将price发送给您的一个双倍资金。

您可以在map内使用map!代替total_amount来避免此特定症状。

作为一个相关方面,如果您为错误提供堆栈跟踪并在代码中识别相应的源代码行,则可以更轻松地提供这些问题的帮助。