2012-02-17 1 views
1

私たちは最初に2000年3月31日に設定したrhinomockのNextInterestDateプロパティを持っています。このプロパティはアクセスされ、この日付は3月の利息計算処理で使用されます。 3月の処理が完了したら、30/04/2000の次の年次の利息日付に更新する必要があります。NMockのReturn.CloneOfに相当するRhinoMocks

ループの次回は、モックでNextInterestDateにアクセスしたときに4月の終了日を返すようにします。要するに、ループの周りに毎回新しい日付が再計算され、モックのプロパティが新しい日付に再割り当てされます。

これは、モックの日付をループの周りで更新する必要があることを意味します。

しかし、私たちが見ているのは、正確に更新されるのではなく、日付が31/03/2000のままであるということです。

私たちはRhinoMockには比較的新しいですが、急速な学習曲線があるように見えますが、私たちはNMockにそれほど好んでいます。

この問題を解決するために、以前の開発者はNMockを使用し、NMockを利用したクローンクラスを使用しました... Return.CloneOFにより、モックがモックを更新して新しい値を供給できるようになりました。

正しい構文/これを実現する方法を理解できないようです。事前に

多くのおかげでよろしくコリンは

答えて

1

あなたは.WhenCalled方法でそれを達成することができます。これは危険なように見えるが、これに正確にあなたがしたいことを行うことがあります

上記のコードは何
var expectedDates = new[] 
{ 
    new DateTime(2000, 3, 31), 
    new DateTime(2000, 4, 30), 
    new DateTime(2000, 5, 31), 
}; 

var invocationsCount = 0; 
service.Expect(s => s.NextInterestDate) 
    .WhenCalled(m => m.ReturnValue = expectedDates[invocationNumber++]) 
    .Return(default(DateTime)); 

が単純である連続する各呼び出しでexpectedDates配列から次の要素を取ります。最後にReturn(default(DateTime))への奇妙な呼び出しがある必要があります(そうしないと、Rhinoはエラーになります)。偽の戻り値がすでにWhenCalledで指定されている場合は、は無視されます。

上記のようなコード(カウンタのインクリメント、配列 - モックセットアップのすべてのもの)に注意する必要があることに注意してください。可読性は最大ではないため、適切な変数/テストメソッドの命名が重要です。

+0

しかし、これらの新しい日付が計算されるので、配列から静的なものを取るのではなく、計算アルゴリズムをWhenCalledブロックに入れます(可能であれば、もちろん可能です)。 –

+0

@IvanGerken:日付が確かにアルゴリズムから来たものであれば、アルゴリズムは* stubbed *し、準備された値を与えなければなりません。それ以外の場合は、誰かがアルゴリズムを変更して、無関係なテストの束が突然破損する可能性があります。あなたは単体テストで*非決定主義*を望んでいません。 –