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のバグですか、それとも間違って使用していますか?