2010-05-02 4 views
0

Je suis novice en matière de moquerie et j'ai commencé avec Rhino Mocks. Mon scénario est comme ceci .. dans ma bibliothèque de classe j'ai une fonction publique et à l'intérieur j'ai un appel de fonction privée, qui obtient la sortie d'un service. Je veux enlever la dépendance de fonction privée.Suppression de la dépendance d'une fonction privée dans une fonction publique à l'aide de Rhino Mocks

public class Employee 
    {   
     public virtual string GetFullName(string firstName, string lastName) 
     { 
      string middleName = GetMiddleName(); 
      return string.Format("{0} {2} {1}", firstName, lastName,middleName); 
     } 

     private virtual string GetMiddleName() 
     { 
      // Some call to Service 

      return "George"; 
     } 
    } 

Ce n'est pas mon vrai scénario bien, je voulais juste savoir comment faire pour supprimer la dépendance de la fonction GetMiddleName() et je dois retourner une valeur par défaut lors des tests unitaires.

Note: Je ne serai pas en mesure de changer la fonction privée here..or comprennent Interface..Keeping les fonctions en tant que telle, est-il possible de se moquer this.Thank

+0

Ce code ne sera pas compilé pour commencer - une méthode privée ne peut pas être virtuelle. –

Répondre

2

Le problème est cette partie: "un appel de fonction privée, qui obtient la sortie d'un service". Ce service devrait être injecté, de sorte que vous pouvez vous moquer. Si cela crée une instance concrète du service, alors je ne pense pas que Rhino puisse vous aider.

TypeMock peut être en mesure de vous aider - Je crois que vous pouvez vous moquer de n'importe quoi, mais au prix d'être plus invasive.

Vous ne devriez pas supprimer la dépendance de appelant la méthode privée, vous devez supprimer la dépendance au sein cette méthode privée. Si vous ne pouvez pas faire cela, votre code n'est tout simplement pas testable sans quelque chose comme TypeMock.

0

Une solution possible est d'utiliser l'extrait et Override modèle pour dériver une classe testable de la classe en cours de test et remplacer la méthode private (qui devrait être autre chose que private dans votre exemple comme méthode private ne peut pas être virtual - peut-être vous vouliez dire protected?) pour vous permettre de remplacer la méthode.

public class Employee 
{   
    public virtual string GetFullName(string firstName, string lastName) 
    { 
     string middleName = GetMiddleName(); 
     return string.Format("{0} {2} {1}", firstName, lastName,middleName); 
    } 

    protected virtual string GetMiddleName() 
    { 
     // Some call to Service 

     return "George"; 
    } 
} 

///<summary> 
///Testable Employee class 
///</summary> 
public class TestableEmployee : Employee 
{  
    public string MiddleName; 

    public virtual string GetFullName(string firstName, string lastName) 
    { 
     string middleName = GetMiddleName(); 
     return string.Format("{0} {2} {1}", firstName, lastName,middleName); 
    } 

    protected override string GetMiddleName() 
    { 
     // provide own implementation to return 
     // property that we can set in the test method 

     return MiddleName; 
    } 
} 

méthode d'essai

[TestMethod] 
public GetFullName_ReturnsSetName() 
{ 
    var testEmployee = new TestableEmployee(); 
    string firstName = "first"; 
    string middleName = "middle"; 
    string lastName = "last"; 

    TestableEmployee.MiddleName = middleName; 

    string fullName = GetFullName(firstName, lastName); 

    Assert.AreEqual(string.Format("{0} {2} {1}", 
        firstName, lastName, middleName), 
        fullName 
        ); 
} 

si GetMiddleName() est wrapper autour d'un appel de service, alors il pourrait être une conception plus testable d'avoir l'interface de service en tant que propriété de la classe Employee. De cette façon, vous pouvez simuler le type de service en utilisant le modèle Extraire et Remplacer ou en utilisant un conteneur Inversion de Contrôle (IoC) comme Unity ou Castle Windsor.

Questions connexes