我在尝试使用与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
答案 0 :(得分: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