2012-01-19 5 views
0

私はsave_titleのメソッドを呼び出していますスタブが、置き換えているメソッドとは異なるタイプのオブジェクトを返す場合、rspecに警告することは可能ですか?

def save_title (data) 
    ... 
    [ if the record exists, update, return 0] 
    [ if the record is new, create, return 1] 
end 

すべての罰金、私はそれをスタブまで:

saved_rows = [] 
proc.stub(:save_title) do |arg| 
    saved_rows << arg 
end 

ここでバグが私は整数を使用していたを決定するために、実際の方法から返されたということです作成されたレコード数と更新されたレコード数。スタブは整数を返しません。 Oooops。実際にコードはうまくいきましたが、テストでは壊れていました。後で(私が認めることを気にする以上に、呪いを含む)私はスタブを認識し、実際の方法は同じように動作しません。これは私が想定している動的言語の落とし穴です。

質問:スタブは本当の方法としてのものと同じ種類のを返さない場合

  1. 私は私を警告するRSpecの言うことはできますか?
  2. この種のことについて警告するために使用できるアナライザーの宝石はありますか?
  3. メソッドから値を返すとわからないようなベストプラクティスがありますか?
+0

あなたは3つの質問をしているので、明確に答えにくいです。それらを3つの別々のSOページに分割してください。 –

答えて

0

1)RSpecのは、あなたはしかし、それを伝えるためにのためにそれはだ、メソッドが返すことになっているオブジェクトの種類を知ることができるという方法...

2)あなたが見ることができる何かがありますがありませんに。スタブを使用する代わりに、テストダブルとしてモックを使用してみてください。基本的にはスタブと同じですが、もっと多くのバリデーションを行うことができます(check out the documentation here)。特定のメソッドが何回呼び出されたか、呼び出されるべき引数、戻り値が何であるべきかといったもの。これらのバリデーションのいずれかが合格しないと、あなたのテストは失敗します。

3)ベストプラクティスはメソッド名自体です。たとえば、?で終わるメソッドは? object.existsのような?常にブール値を返さなければなりません。あなたの場合、私はあなたのメソッドのリファクタリングを提案します。おそらく2つに分けます.1つは更新のために、もう1つは作成のために、オブジェクトが存在するかどうかを伝える別の方法があります。入力に応じてメソッドが2つの異なる方法で動作するようにすることはお勧めできません(separation of concerns参照)

幸いです!お役に立てれば。

+0

答えをありがとう。私はこれをやっているとは思わない: "メソッドは、入力に応じて2つの異なる方法で動作させることは良い習慣ではありません" – jcollum

+0

まあ、その知覚の問題。あなたが投稿したコードに基づいて、私が把握できるもの:)このメソッドは2つのこと(更新または作成)を行い、手前で何をするかを知る方法がありません。ありがとう! –

+0

本当ですが、Mongoidを使用している場合は、それは1つの方法です:find_or_initialize_by – jcollum

関連する問題