NSubstitute:La vérification des méthodes reçues avec des arguments de type tableau
-
12-12-2019 - |
Question
Je veux vérifier qu'une méthode sur mon NSubstitute maquette est appelée avec un argument de tableau.
Dire l'interface, IProcessor
, a une méthode void ProcessSomething(Foo[] something])
.Dire que ma classe sous test est nommé Commander
.J'ai mis mon test comme ceci:
//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
L' Received()
appel échoue avec:
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[]*)
Si cela ressemble à ProcessSomething a été appelé avec certains matrice autres que foos
, droit?
Eh bien, si j'ai plutôt tester ce, où j'ai fait une capture de la valeur de l'argument à l'aide de Arg.Do()
, il réussit:
//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
Si la capture de l'argument et de comparaison pour l'égalité (avec NUnit dans cet exemple) fonctionne, mais la vérification de la réception de l'appel échoue.
Est-ce un bug NSubstitute, ou suis-je à l'aide de ce mal?
La solution
Je suppose que votre Commander
objet les arguments et les met dans un tableau qu'il utilise ensuite pour appeler la Processor
se moquer.
Votre foos
variable est un autre tableau que vous créez sur votre installation.Les tableaux ne comparez pas égaux les uns aux autres, même s'ils ont les mêmes éléments.Donc NSubstitute va se plaindre qu'il n'a pas reçu la valeur attendue (il a reçu un autre tableau de ce qui s'est passé pour contenir les mêmes éléments).
Edit: Essayez cette version:
//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));
Cela nécessite l'importation de la System.Linq
Espace de noms