2017-01-24 8 views
-1

OpenStructインスタンスメソッドの名前と同じ名前の属性を持つオープン構造体を作成しようとすると、問題が発生しています。具体的には、属性がcaptureのオープンな構造体を作成したいと考えています。私はRSpecのテストでスタブとしてこれを使用していますので、私はメソッドの名前を変更することはできませんOpenStruct方法を見てインスタンスメソッドと同じ名前のOpenStruct属性を定義する

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

(それはcaptureでなければならない)、それは方法captureを持っており、それこのメソッドは呼び出されています。そのメソッドの1つと同じ名前の属性を持つ構造体をインスタンス化する方法はありますか?

明確にするために、私は特に、レール4.0ではなくレール5でブレークを確認したメソッドキャプチャが必要ですが、このような状況はopenstructが持つ可能性のあるどのメソッドでも当てはまります。

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

答えて

0

これは、(ちなみに、ルビー2.3を実行している)pryに私のためだけで正常に動作し

[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 
+0

レール5ではうまく動作しますが、レールでは動作しません。4. 'class'メソッドを使用すると、openstructインスタンスメソッドが使用されますが、属性は定義されません。 – PhilVarg

+0

"あなたがメソッド 'class ''? –

+0

'capture'の代わりに' class'属性を定義すると、属性iが定義するのではなく、 'struct'メソッドを使用します。私は明快に私の質問を編集しました – PhilVarg

関連する問題