48

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を使用して)等しいかどうかを比較することはできますが、受信した呼び出しの検証は失敗します。

これはNSubstituteのバグですか、それとも間違って使用していますか?

4

1 に答える 1

72

私はあなたのCommanderオブジェクトが引数を取り、それらを配列に入れ、それを使ってProcessorモックを呼び出すと思います。

変数foosは、セットアップで作成する別の配列です。同じ要素を持っていても、配列は互いに等しく比較されません。したがって、NSubstituteは、期待値を受け取らなかった(同じ要素を含む別の配列を受け取った)と文句を言います。

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

//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これには、名前空間をインポートする必要があります

于 2012-10-02T22:16:24.400 に答える