Domanda

Voglio verificare che un metodo sul mio NSubStitute Chock sia chiamato con un particolare argomento di array.

Dì l'interfaccia, IProcessor, ha un metodo void ProcessSomething(Foo[] something]).Dì che la mia classe sotto test è denominata Commander.Ho impostato il mio test come questo:

//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
.

La chiamata Received() non riesce con:

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[]*)
.

Quindi questo sembra che il processo di processo sia stato chiamato con qualche array diverso da foos, giusto?

Bene, se invece testerò questo tipo, dove catturando il valore dell'argomento usando Arg.Do(), ha esito positivo:

//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
.

Quindi catturare l'argomento e confrontandolo per l'uguaglianza (con NULIT in questo esempio) funziona, ma la verifica della chiamata ricevuta fallisce.

È un bug in Nsubstit, o lo sto usando male?

È stato utile?

Soluzione

Suppongo che il tuo oggetto Commander prenda gli argomenti e li mette in un array che quindi utilizza per chiamare il derisione Processor.

La tua variabile foos è un altro array che si crea sulla configurazione.Gli array non confrontano uguali l'uno all'altro anche se hanno gli stessi elementi.Quindi Nsubstigstit si lamenterà di non aver ricevuto il valore previsto (ha ricevuto un altro array che è accaduto per contenere gli stessi elementi).

Modifica: Prova questa versione:

//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));
.

Ciò richiede l'importazione dello spazio dei nomi System.Linq

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top