c# - test - nsubstitute xunit
NSubstitute: Comprobando los métodos recibidos con argumentos de matriz (1)
Supongo que su objeto Commander
tomará los argumentos y los colocará en una matriz que luego utilizará para llamar al Processor
falso.
Tu variable foos
es otra matriz que creas en tu configuración. Las matrices no se comparan entre sí, incluso si tienen los mismos elementos. Así que NSubstitute se quejará de que no recibió el valor esperado (recibió otra matriz que por casualidad contenía los mismos elementos).
Editar: Pruebe esta versión:
//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));
Esto requiere importar el espacio de nombres System.Linq
Quiero verificar que se llame a un método en mi simulacro NSubstitute con un argumento de matriz particular.
Digamos que la interfaz, IProcessor
, tiene un método void ProcessSomething(Foo[] something])
. Digamos que mi clase bajo prueba se llama Commander
. Configuré mi prueba así:
//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 llamada Received()
falla 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[]*)
Así que esto parece que se llamó a ProcessSomething con una matriz distinta de foos
, ¿verdad?
Bueno, si en cambio Arg.Do()
esto, donde capture el valor del argumento usando Arg.Do()
, tiene éxito:
//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
Así que capturar el argumento y compararlo para la igualdad (con NUnit en este ejemplo) funciona, pero la verificación de la llamada recibida falla.
¿Es esto un error en NSubstitute, o lo estoy usando mal?