Ruby和Rspec嘲讽一个哈希值

问题描述 投票:0回答:1

我创建了一个方法,将哈希中的所有值对相加。这个方法是可行的,但是我很难模拟一个测试。

下面是这个方法。

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 ==)

就像我提到的,类中的方法是有效的。只是需要我的测试通过!任何帮助将是巨大的。

ruby rspec hashmap mocking
1个回答
1
投票

我想你要找的是一个 偏双 以截断某些功能,同时允许该对象仍能正常工作。

类似于下面的例子。

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

© www.soinside.com 2019 - 2024. All rights reserved.