【发布时间】:2015-04-15 15:43:59
【问题描述】:
如何创建 rspec 方法存根以允许来自接受散列键的方法的响应以返回其值?
这是我要测试的行
sub_total = menu.menu_items[item] * quantity
我在 rspec 中使用这条线作为我的测试存根。
allow(menu).to receive(:menu_items[item]).and_return(2.0)
我的环境是用 ruby 2.2.0 和 spec 3.1.7 设置的
但是我一直得到一个
NameError: undefined local variable or method `item'
Ruby 代码
def place_order(item, quantity, menu)
sub_total = menu.menu_items[item] * quantity
@customer_order << [item, quantity, sub_total]
end
Rspec 代码
let(:menu) { double :menu }
it "should allow 1 order of beer to placed" do
order = Order.new
allow(menu).to receive(:menu_items[item]).and_return(2.0)
order.place_order(:Beer, 1, 2.0)
expect(order.customer_order).to eq [[:Beer, 1, 2.0]]
end
失败:
1) Order should allow 1 order of beer to placed
Failure/Error: allow(menu).to receive(:menu_items[item]).and_return(2.0)
NameError:
undefined local variable or method `item' for #<RSpec::ExampleGroups::Order:0x007fbb62917ee8 @__memoized=nil>
# ./spec/order_spec.rb:9:in `block (2 levels) in <top (required)>'
我尝试了很多方法,但没有任何效果
allow(menu).to receive(:menu_items).and_return(2.0)
allow(menu).to receive(:menu_items).with(item).and_return(2.0)
allow(menu).to receive(:menu_items).with("item").and_return(2.0)
allow(menu).to receive(:menu_items).with([item]).and_return(2.0)
我在 irb 中运行了我的代码,我可以看到它可以工作,但我找不到让我的班级双倍接收哈希键的方法。
【问题讨论】:
-
似乎是一种脆弱的测试方法,但如果必须,让
menu.menu_iterms返回一些mock_menu_items和存根mock_menu_items以接收:[]和item并返回@987654333 @.