使用与实例方法

时间:2017-01-24 00:45:29

标签: ruby openstruct

我在尝试使用与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

1 个答案:

答案 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