69 votes

MOQ - comment se moquer d'une interface qui doit être transposée sur une autre interface?

ce que je veux faire, c'est construire une moq pour I1 - ce qui est bien ... cependant, dans le cadre de la méthode que je suis en train de tester qui utilise cette maquette j'ai besoin de le jeter aux I2 pour accéder à certaines propriétés qui ne sont pas sur I1

Interface I1 
{ int AProperty{get;set;}}

Interface I2
{int AnotherProperty{get;set;}}

J'ai ensuite certains objets

Class O1 : I1 {}

et

Class O2 : O1 , I2 {}

le problème est que lorsque j'ai une instance d'un I2 mise en œuvre de l'objet, je peux le jeter aux I1 afin d'accéder aux méthodes qui sont mises en œuvre par le biais de cette interface. Dans le code, ce n'est pas un problème et everythign fonctionne comme prévu.

Le seul problème vient lors de l'écriture d'un test unitaire sur cette classe.

Les interfaces également exposer une méthode appelée GetNewInstance qui retourne une instance initialisée de la mise en œuvre de l'objet de la fonte dans le IGetNewInstance interface ... je suis habituellement capable de se moquer de cette amende et de faire ce qu'il revienne de lui-même (et donc je continue à travailler avec le simulacre de l'objet).

toutefois, lorsque vous essayez de lancer cette retourné objet de type I2 I1 en référence null résultats - ce qui fait sens, comme le simulacre de l'objet qui implémente I2 de ne pas hériter de tout ce qui en hérite I1.

la question est de savoir comment puis-je la force à l'objet fantaisie pour hériter de deux I1 ansd I2 en même temps?

117voto

Håvard S Points 11152

Si je vous comprends bien, vous voulez créer une maquette qui implémente deux interfaces. Avec Moq, c'est aussi simple que cela:

 var mock = new Mock<IFoo>(); // Creates a mock from IFoo
mock.As<IBar>(); // Adds IBar to the mock
 

Maintenant, vous pouvez définir vos attentes et utiliser votre maquette comme vous utiliseriez normalement l’objet mettant en œuvre à la fois IFoo et IBar .

Pour votre méthode GetNewInstance , vous pouvez simplement configurer une attente qui retourne la maquette.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X