2012-10-02 12 views
30

特定の配列引数を使用してNSubstituteモックのメソッドが呼び出されたことを確認します。NSubstitute:配列引数を使って受信したメソッドを確認する

IProcessorのインターフェイスはvoid ProcessSomething(Foo[] something])です。テスト中のクラスがCommanderという名前であるとします。

//prepare 
var processor = Substitute.For<IProcessor>; 
var commander = new Commander(processor); 
var foo1 = new Foo("alpha"); 
var foo2 = new Foo("bravo"); 
var foos = new [] {foo1, foo2}; 

//act 
commander.DoSomething(foo1, foo2); 

//verify 
processor.Received().ProcessSomething(foos); // FAILS 

Received()呼び出しがで失敗します:私はこのように私のテストを設定

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching: 
    ProcessSomething(Foo[]) 
Actually received no matching calls. 
Received 1 non-matching call (non-matching arguments indicated with '*' characters): 
    ProcessSomething(*Foo[]*) 

ProcessSomethingが右foos以外のいくつかのアレイと呼ばれていたようなので、これが見えますか?

まあ、私が代わりに私がArg.Do()を使用して引数の値をキャプチャする場合は、このようなテストならば、それは成功します。

//prepare 
//... as before 
var actualFoos = null; 

processor.ProcessSomething(Arg.Do<Foo[]>(x => actualFoos = x)); 

//act 
commander.DoSomething(foo1, foo2); 

//verify 
Assert.That(actualFoos, Is.EqualTo(foos)); // SUCCEEDS 

ので、引数をキャプチャし、(この例では、NUnitのと)平等のためにそれを比較する働き、受信したコールが失敗したことを確認します。

これはNS substituteのバグですか、それとも間違っていますか?

答えて

36

あなたのCommanderオブジェクトが引数をとり、それをProcessorモックを呼び出すために使用する配列に入れているとします。

foos変数は、セットアップ時に作成する別の配列です。同じ要素を持っていても、配列は互いに等しいとは限りません。だからNS substituteは期待値を受け取っていないと不満を持ちます(同じ要素を含む別の配列を受け取りました)。

編集:このバージョンを試してみてください:

//prepare 
var processor = Substitute.For<IProcessor>; 
var commander = new Commander(processor); 
var foo1 = new Foo("alpha"); 
var foo2 = new Foo("bravo"); 
var foos = new [] {foo1, foo2}; 

//act 
commander.DoSomething(foo1, foo2); 

//verify 
processor.Received().ProcessSomething(Arg.Is<Foo[]>(foos2 => foos.SequenceEqual(foos2)); 

これはあなたの答えを読んだ後System.Linq名前空間

+1

をインポートする必要があり、私はNUnitのソースに見えた、と(EqualConstraint経由)Is.EqualToことを見ましたコレクション内のアイテムを比較することによって、コレクションが同等かどうかをチェックします。だからこそ値を取り込み、チェックしたのです。 ここで問題になるのは、.NetコレクションでEqualsが実装されているのはなぜですか。それは別の日の問題です。 – Jimothy

+0

素敵な構文です。 RhinoMocksよりずっときれいです –

関連する問題