처음에는 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
내가 의심, 그 내 조롱 개체에 대한 몇 가지 작업을 수행 할 때 그것의 속성을 잃게됩니다. 질문은 다음과 같습니다.
- 정상적으로 작동합니까?
- 이 문제의 해결책은 무엇입니까? 내 기능의 결과를 모의해야할까요?
total_amount
에서map!
의