我创建了一个方法,将哈希中的所有值对相加。这个方法是可行的,但是我很难模拟一个测试。
下面是这个方法。
class Basket
attr_reader :order, :total
def initialize
@order = {}
@total = total
end
def add
@total = (@order.map { |x,y| y}).sum.round(10)
end
end
而测试中,我试图嘲讽哈希。
order = {"pizza" => 12.99}
let(:basket) { double(order: order, total: nil, add: nil)}
describe '#add' do
it 'calculates the total price for an order' do
basket.add
expect(basket.total).to eq 12.99
end
end
还有失败的消息。
expected: 12.99
got: nil
(compared using ==)
就像我提到的,类中的方法是有效的。只是需要我的测试通过!任何帮助将是巨大的。
我想你要找的是一个 偏双 以截断某些功能,同时允许该对象仍能正常工作。
类似于下面的例子。
class Basket
attr_reader :order, :total
def initialize
@order = {}
end
def add
@total = order.map { |_,y| y}.sum # note no @ in front of order
end
end
RSpec.describe Basket do
let(:order) { {"pizza" => 12.99} }
let(:basket) { Basket.new}
describe '#add' do
it 'calculates the total price for an order' do
allow(basket).to receive(:order).and_return(order)
basket.add # we have to call add or total will be nil
expect(basket.total).to eq 12.99
end
end
end
这里我们使用一个真实的 Basket
但是,当那个篮子叫 #order
我们把响应存根。
还有相当多的其他清理工作要做,因为现在没有办法把订单放在篮子里,如果你不打电话给 #add
然后 total
将是 nil
纵有 order