2012-12-15 6 views
14

私はいくつかのクラスのインスタンスをスタブしようとしています。私はfetchメソッドをスタブする必要があります。このメソッドは、自分自身をいくつかのデータで埋めています。RSpec any_instance return self

self変数にアクセスして修正してfetchメソッドに戻るにはどうすればよいですか?

MyObject.any_instance.stub(:fetch) { self } 

MyObjectインスタンスを返しません。

多分、このような状況ではモックがより便利です。残念ながら、私はまだ彼らを理解していません。

答えて

1

私が見る限り、これは何らかの理由で可能ではないようです。私は現在rspec-mocksの実装をチェックし、実際にスタブ実装を呼び出す方法は次のようだ:それはそうと

# lib/rspec/mocks/message_expectation.rb:450 
def call_implementation(*args, &block) 
    @implementation.arity == 0 ? @implementation.call(&block) : @implementation.call(*args, &block) 
end 

、ブロックは単にinstance_evalを通じて自身で呼び出されていません。たぶんあなたが望むものを達成するための別のテクニックがあります。結局、私はRSpecの専門家ではありません。

12

これに対処するためのopen rspec-mocks issueがあります。私はある時点でそれに対処することを望んでいますが、ブロック実装でany_instanceを使用する既存の仕様スイートを壊さない方法でこれを追加するのは簡単ではありません。追加の引数(例:オブジェクトインスタンス)。

全体的に、any_instanceはいくつかの状況では便利ですが、それは少し臭いです。個々のインスタンスを模擬したりスタブする方法が見つかった場合、一般的に問題は少なくなります。ここで

は、私がテストしていませんが、動作するはずですその周りの仕事です:

orig_new = MyObject.method(:new) 
MyObject.stub(:new) do |*args, &block| 
    orig_new.call(*args, &block).tap do |instance| 
    instance.stub(:fetch) { instance } 
    end 
end 

基本的に私たちがインスタンス化され、それぞれの新しいインスタンスにfetchをスタブできるように、我々はMyObject.newに引っ掛けることで、ここでany_instanceをシミュレートしています。

「テストを聞く」ことが重要です。テストするのが難しい場合は、すぐにany_instanceのような電動工具を使用するのではなく、自分のデザインについて何を言うかを考えてください。あなたのオリジナルの質問は、あなたのデザインに関する何かを推測するのに十分な文脈を与えていませんが、これを行う必要があるときに私が始める場所は間違いありません。

+0

私は素晴らしい仕事をしてくれました。どうもありがとう! – jethroo

関連する問題