Moq une classe de base de la fonction à partir d'une classe dérivée
Je suis nouveau sur le Moq et je viens de regarder le pluralsight vidéo sur Moqing donc j'ai senti que la capacité d'agir et d'écrire des tests. J'ai une Classe de Base, disons Feuille qui implémente une interface ISheet. La feuille est la classe de base pour les pages:
abstract class Sheet: ISheet
{
public virtual void CreateSheet() //Defined in ISheet
{
}
public virtual void BuildSheet() //Defined in ISheet
{
}
//and some abstract methods, etc.
}
public class Page : Sheet
{
public override void CreateSheet()
{
BuildSheet(); //Base class implementation
}
}
J'ai remplacé une des méthodes de la classe de base qui est CreateSheet()
, mais je veux tester que le BuildSheet()
méthode dans la classe de base est appelé à partir de ma classe dérivée:
Donc, dans ma Classe de Test, je Moq le SUT au lieu de l'interface
var MockSheet = new Moq<Page>();
appel de la méthode:
var actual = MockSheet.Object.CreateSheet();
Puis vérifier
MockSheet.Verify(x => x.BuildSheet(), Times.AtLeastOnce);
Au lieu-je obtenir MockException “Attendu Invocation au cours de l'exercice au moins une fois mais n'a jamais été effectuée. Le CreateSheet méthode n'est jamais appelé. Si je change il CreateSheet méthode:
public void CreateDocSheet() //removed override
{
BuildSheet() //base classses implementation
}
Et dans l'appel test:
var actual = MockSheet.Object.CreateDocSheet();
Il fonctionne. Je ne comprends pas pourquoi. Je crois que fonctionnellement que c'est un moyen valable de codage, j'ai de la feuille, qui dispose de 2 pages, j'ai une Interface qui définit toutes les fonctions et les propriétés qui doivent être mis en œuvre, je mise en œuvre de ces fonctions dans la classe de base, mais pas toutes les méthodes ont besoin d'être mises en œuvre dans les classes dérivées, donc, un peu de méthode, sont remplacées et une certaine utilisation de la classe de base de la mise en œuvre. Veuillez expliquer pourquoi c'est un problème pour utiliser la version de remplacement de la fonction?
OriginalL'auteur user3666407 | 2015-01-29
Vous devez vous connecter pour publier un commentaire.
Si vous modifiez
en
votre maquette (que vous pouvez considérer comme une classe dérivée de
Page
) qui fera appel à la mise en œuvre dePage
dans la fantaisie propre à remplacer deCreateSheet
.Le comportement par défaut (si vous ne changez pas
CallBase
) est pour Moq pour remplacer chaque méthode et de propriété qu'il peut, et l'utilisation d'un vide mise en œuvre. RéglageCallBase
àtrue
fait Moq appeler lePage
mise en œuvre au lieu de cela, comme je l'ai dit.(Bien sûr, l'utilisation
MockSheet.Setup(x => x.CreateDocSheet()).Callback(() => { /* something */})
si vous voulezCreateDocSheet
à faire quelque chose de non négligeable.)Dans le cas où vous avez supprimé le
virtual
modificateur deCreateSheet
, Moq ne peut plus ignorer ou se moquer de ce membre. Pensez-y: Comment pourrait-Moq "se moquer de" non-méthode virtuelle? Par conséquent, l'appel ignore Moq classe complètement.Page.CreateSheet
appelsSheet
'sBuildSheet
mise en œuvre et de ne pasPage
'sBuildSheet
mise en œuvre. Moq est seulement capable d'enregistrer les appels à son propre proxy pour se moquaient de l'objet lui-même.Merci ça a fonctionné et merci pour l'explication. Je pense qu'il y a un moyen de tester une classe de base de la mise en œuvre à partir d'un dérivé de la classe sans avoir à écrire une nouvelle fonction dont je n'ai pas l'intention de faire de toute façon.
OriginalL'auteur Jeppe Stig Nielsen
Moq est pour imiter une dépendance ou les dépendances de votre système en cours de test, de sorte que vous pouvez isoler que dans le reste de votre application ou d'externalités, pas pour remplacement votre système sous test. Ce n'est pas le bon outil pour ce que vous essayez de faire ici.
OriginalL'auteur tom.dietrich