Comment créer des maquettes pour la classe de base abstraite à l'aide de MOQ cadre?
Je veux écrire des tests unitaires pour MyClass mais sa classe de base est une classe abstraite.
public class MyClass : AbstractBaseClass
{
}
Je veux de se Moquer de l'AbstractBase classe, de sorte que je ne peux ignorer la logique dans son constructeur lors de la création de l'instance de Maclasse que je veux tester. Est-il de toute façon je peux le faire?
//Unit Test
var test = new Mock<IInterface>();
var derivedclass = new DerivedClass(test.Object);
test.Setup(d=>d.MyMethod(It.IsAny<string>()).returns(2);
derivedclass.MyMethod("hello");
//Derived Class
class DerivedClass : AbstractClass{
//constuctor
public DerivedClass(IInterface interface){
_interface = interface;
}
public MyMethod(string str){
return 2;
}
}
//Abstract Class
public abstract class AbstractClass
{
//This method gets called when i create the instance of the derived class in my unit
test..
protected AbstractedClass() : this(new SomeOtherClass()){
DoSomethingElse(); ///I want to skip this method or mock it.
}
}
- Vous avez un problème de conception. AbstractClass est coder en dur l'instanciation d'une dépendance dans son ctor. Si les méthodes de cette dépendance sont ce que vous voulez de fantaisie, vous devez modifier le AbstractClass ctor à prendre dans la dépendance. Si vous pouvez élaborer sur ce que cette méthode n'est à l'interne, peut-être vous obtenir quelques réponses de meilleure qualité
Vous devez vous connecter pour publier un commentaire.
En héritant de la classe de base vous de l'étendre. Il est plus sur l'obtention de votre code dans un testable de l'état plutôt que d'avoir Moq travail pour vous.
Ou ont cette logique que vous ne voulez pas être une partie d'une méthode virtuelle que vous pouvez vous moquer. (comme @Ohad la Forêt de la réponse:)
Si ces options ne sont pas viables, alors vous devrez tester cette fonctionnalité par le biais de la classe dérivée ou d'utiliser un autre se moquant de cadre comme TypeMock Isolateur, grains de beauté ou JustMock.
Oui c'est un joli scénario de base dans Moq.
En supposant que votre classe abstraite ressemble à ceci:
Vous pouvez écrire le test ci-dessous: