with unit test net c# nsubstitute

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?