ruby – rspec stub允许传递[hash_key]

如何创建一个rspec方法存根以允许来自接受哈希键的方法的响应返回其值?

这是我想测试的一行

sub_total = menu.menu_items[item] * quantity

我在rspec中使用这一行作为我的测试存根.

allow(menu).to receive(:menu_items[item]).and_return(2.0)

我的环境设置为ruby 2.2.0和规范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,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,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_items [item]实际上由3个方法调用组成. []是对menu_items返回的哈希上方法 []调用.

我假设menu.menu_items返回一个哈希而不是一个数组,在规范项中给出的是一个符号.

这意味着你的存根需要更多的工作.

allow(menu).to receive(:menu_items).and_return({ Beer: 2.0 })

还要注意,错误

undefined local variable or method `item'

是因为您在规范中使用了item,但是在方法之外没有定义item.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...