NSubstitute:La vérification des méthodes reçues avec des arguments de type tableau

StackOverflow https://stackoverflow.com//questions/12699066

  •  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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top