-1

我在尝试创建具有与 OpenStruct 实例方法之一同名的属性的开放结构时遇到了问题。具体来说,我想创建一个具有属性的开放结构capture。我在 rspec 测试中使用它作为存根,所以我不能更改方法的名称(它必须是capture

#=> OpenStruct.new(capture: true).capture 
#=> ArgumentError: wrong number of arguments (0 for 1)

查看 OpenStruct 方法,它有一个方法capture,并且正是这个方法被调用。有没有办法用与其方法之一同名的属性来实例化一个开放结构?

为清楚起见,我特别需要方法捕获,我已经确认在 rails 4.0.x 但不是 rails 5 上有中断,但这种情况适用于 openstruct 可能具有的任何方法。

#=> OpenStruct.new(class: true).class 
#=> OpenStruct
4

1 回答 1

0

这对我来说很好用pry(顺便说一下,运行 ruby​​ 2.3)

[9] pry(main)> OpenStruct.new(capture: 1).capture
=> 1

这是另一种方法:

[15] pry(main)> a = OpenStruct.new capture: 1
=> #<OpenStruct capture=1>
[22] pry(main)> a.singleton_class.class_exec { def capture; self[:capture] + 1; end }
=> :capture
[23] pry(main)> a.capture
=> 2

我不知道您使用的是什么测试库,但如果它是 RSpec,您也可以使用这种模拟方法:

a = OpenStruct.new capture: 0
allow(a).to receive(:capture).and_return(a[:capture])
a.capture # => 0
于 2017-01-24T00:53:52.247 回答