Question

Mon équipe a récemment pris la décision d'utiliser Moq comme cadre de travail moqueur pour sa grande flexibilité et sa syntaxe hautement lisible. Comme nous sommes nouveaux dans ce domaine, je tombe sur des questions qui semblent simples - les recherches (ici, Google, etc.) trouvent de nombreuses discussions sur les autres nuances de Moq, mais pas nécessairement sur ce que je recherche, et les quelques questions apparemment apparentées se sont transformées en harengs rouges.

Nous testons une classe qui a une dépendance externe (Amazon SimpleDb pour être précis), mais nous ne voulons pas que nos tests soient liés à une connexion en direct. Une méthode particulière:

  • Applique des "activités commerciales". logique
  • Si nécessaire, appelez un appel vers SDB via un fournisseur que nous avons construit, appelons-le SaveItem ()

Je veux tester un peu cela de manière à configurer le contexte requis et à nous assurer que SaveItem () a été appelé, mais d'une manière telle que SaveItem () soit vraiment ' t invoqué (parce que A) le fournisseur de SDB est un simulacre qui n’est pas complètement hydraté et qui risque de bombarder et B) je ne veux pas avoir à payer pour cette transaction des centaines et des milliers de fois).

Lorsque vous traitiez avec des méthodes qui renvoyaient une valeur, cela était trivial.

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo");

Dans le cas que je décrirais ci-dessus, mon " SaveItem () " method est void et par conséquent, l'option d'utiliser la méthode Returns () de Moq n'est pas disponible. Et bien que je puisse configurer un rappel pour vérifier que SaveItem () est appelé, je ne peux cependant pas sembler le faire pour qu'il ne fasse rien. "

Naïf / plein d'espoir, je pensais que les solutions suivantes fonctionneraient, mais il semble que la méthode soit toujours invoquée:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>()));

Alors la question à un million de dollars: quel est le Moq du code fictif suivant?

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE();
Était-ce utile?

La solution

Si la méthode SaveItem () est virtuelle ou abstraite et que vous ne définissez pas Callbase = true , cette méthode doit être ré-implémentée pour ne rien faire. la maquette.

Vous devriez pouvoir faire:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable();

...  test here ...

mockDb.Verify();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top