Je veux vérifier qu'une méthode sur mon mock nsubstitut est appelée avec un argument de tableau particulier.
Dites l'interface, IProcessor
, a une méthode void ProcessSomething(Foo[] something])
. Disons que ma classe sous test est nommée Commander
. J'ai mis en place mon test comme celui-ci:
//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
Le Received()
appelle é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[]*)
Donc, cela ressemble à des processus qui ont été appelé avec un tableau autre que foos
, non?
Eh bien, si je testai plutôt cela comme, où je capture la valeur de l'argument en utilisant 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
Ainsi capturer l'argument et la comparer pour l'égalité (avec Nunit dans cet exemple) fonctionne, mais la vérification de l'appel reçu échoue.
Est-ce un bug de Nsubstitut, ou je l'utilise mal?
Je suppose que votre objet Commander
prendra les arguments et les met dans un tableau qu'il utilise ensuite pour appeler le Processor
moche.
Votre variable foos
est une autre matrice que vous créez sur votre configuration. Les tableaux ne se comparent pas égaux les uns aux autres même s'ils ont les mêmes éléments. Donc, Nsubstitut se plaint de ne pas avoir reçu la valeur attendue (elle a reçu un autre tableau contenant 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 d'importer le System.Linq
Espace de noms