特定の配列引数を使用して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のバグですか、それとも間違っていますか?
をインポートする必要があり、私はNUnitのソースに見えた、と(EqualConstraint経由)Is.EqualToことを見ましたコレクション内のアイテムを比較することによって、コレクションが同等かどうかをチェックします。だからこそ値を取り込み、チェックしたのです。 ここで問題になるのは、.NetコレクションでEqualsが実装されているのはなぜですか。それは別の日の問題です。 – Jimothy
素敵な構文です。 RhinoMocksよりずっときれいです –