如何创建一个rspec方法存根以允许来自接受哈希键的方法的响应返回其值?
这是我想测试的一行
sub_total = menu.menu_items[item] * quantity
Run Code Online (Sandbox Code Playgroud)
我在rspec中使用这一行作为我的测试存根.
allow(menu).to receive(:menu_items[item]).and_return(2.0)
Run Code Online (Sandbox Code Playgroud)
我的环境设置为ruby 2.2.0和规范3.1.7
但是我继续得到一个
NameError: undefined local variable or method `item'
Run Code Online (Sandbox Code Playgroud)
def place_order(item, quantity, menu)
sub_total = menu.menu_items[item] * quantity
@customer_order << [item, quantity, sub_total]
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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)>'
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西,但没有任何效果
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)
Run Code Online (Sandbox Code Playgroud)
我在irb中运行我的代码,我可以看到它的工作原理,但我找不到让我的类加倍来接收哈希键的方法.
该线menu.menu_items[item]实际上由3个方法调用组成.[]是[]对Hash返回的方法的调用menu_items.
我假设menu.menu_items返回a Hash而不是a Array,在规范中给出的item是a Symbol.
这意味着你的存根需要更多的工作.
allow(menu).to receive(:menu_items).and_return({ Beer: 2.0 })
Run Code Online (Sandbox Code Playgroud)
还要注意,错误
undefined local variable or method `item'
Run Code Online (Sandbox Code Playgroud)
是因为你item在规范中使用,但item没有在你的方法之外定义.
你可以这样做:
allow(menu.menu_items).to receive(:[]).and_return({Beer: 2.0})
Run Code Online (Sandbox Code Playgroud)
如果需要,您还可以传递特定项目:
allow(menu.menu_items).to receive(:[]).with(1).and_return({Beer: 2.0})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7772 次 |
| 最近记录: |