web-dev-qa-db-fra.com

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

ce que je veux faire est de construire un moq pour I1 - ce qui est bien ... mais au cours de la méthode que je teste qui utilise cette maquette, je dois le convertir en I2 afin d'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 alors quelques objets

Class O1 : I1 {}

et

Class O2 : O1 , I2 {}

le problème est que lorsque j'ai une instance d'un objet d'implémentation I2, je peux le convertir en I1 afin d'accéder aux méthodes implémentées via cette interface. Dans le code, ce n'est pas un problème et everythign fonctionne comme prévu.

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

Les interfaces exposent également une méthode appelée GetNewInstance qui retourne une instance initialisée de l'objet d'implémentation cast dans l'interface IGetNewInstance ...

cependant, lorsque vous essayez de convertir cet objet renvoyé de type I2 en I1, une référence nulle résulte - cela a du sens car l'objet factice qui implémente I2 n'hérite pas de tout ce qui hérite I1.

la question est de savoir comment puis-je forcer l'objet simulé à hériter des deux I1 et I2 en même temps?

65
John Nicholas

De la façon dont je vous comprends, 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
mock.As<IBar>().Setup(m => m.BarMethod()).Returns(new object()); // For setups.

Maintenant, vous pouvez définir des attentes et utiliser votre maquette comme vous le feriez normalement avec l'objet implémentant à la fois IFoo et IBar.

Pour votre méthode GetNewInstance, vous pouvez simplement configurer une attente qui renvoie la maquette elle-même.

112
Håvard S