2014-11-16 2 views
0

처음에는 Ruby와 TDD 프로그램을 배우고 있다고 말하면서 용서 해주십시오. 사실 나는 두 가지 질문이 서로 관련되어 있지만 먼저이 코드를 살펴 보시기 바랍니다. 수업 단위에 대한 내 단위 테스트의 일부 :조롱 된 객체에 대한 작업을 수행하면 어떻게됩니까? 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. 이 문제의 해결책은 무엇입니까? 내 기능의 결과를 모의해야할까요? total_amount에서 map!

답변

1

사용이, 그들의 가격으로 대체, 순서와 관련된 products을 건드리지있다 그래서 당신이 순서의 제품에 price 호출 다음에 (예를 들어 total_amount에 대한 후속 호출 등) 당신은 돈을 두배 중 하나에 price을 보내고 있습니다.

map! 대신 대신 map을 사용하면이 특정 증상을 피할 수 있습니다.

스택 추적에 오류를 제공하고 코드에서 해당 소스 행을 식별하면 관련 문제로 이러한 종류의 질문에 대한 도움말을 제공하는 것이 훨씬 쉽습니다.

관련 문제