2010-04-15 9 views
2

J'essaye d'écrire un test unitaire pour une méthode, qui a un appel à la méthode de dll. Y at-il de toute façon je peux me moquer des méthodes dll afin que je puisse tester l'unité?Mock dll méthodes pour les tests unitaires

public string GetName(dllobject, int id) 
{ 
    var eligibileEmp = dllobject.GetEligibleEmp(id); <---------trying to mock 
                   this method 

    if(eligibleEmp.Equals(empValue) 
    { 
     .......... 
    } 
} 
+0

Pourquoi ne pas utiliser la DLL réelle dans le cadre du test? En regardant le code, il semble que ce que vous devez faire est de créer un objet employé de test que vous pouvez retourner dans le cadre du test. En supposant que ce n'est pas un aspect critique du test. – Harv

+2

@Harv que faire si l'objet dll frappe une base de données? Vous ne pouvez pas être sûr de tout ce qui est impliqué dans ce comportement, ce qui est probablement la raison pour laquelle il veut le réduire. – Joseph

+0

@Joseph, vous avez raison, la DLL frappe la base de données, donc je veux me moquer – sanjeev40084

Répondre

2

Lorsque vous utilisez une bibliothèque tierce partie qui ne fournit pas un moyen de test de doubler pour les tests unitaires, la meilleure station est de créer un test doublable Facade. Créez une classe dont la seule responsabilité est de fournir une interface de test doublable dans la bibliothèque tierce. Il ne fait que passer des appels à la bibliothèque, mais il le fait de telle sorte que vous pouvez lier contre une abstraction de celui-ci et se moquer d'elle.

Par exemple:

public interface IMyDllObject 
{ 
    object DllObject { get; set; } 
    object GetEligibleEmp(int id); 
} 

public class MyDllObject : IMyDllObject 
{ 
    object DllObject { get; set; } 
    object GetEligibleEmp(int id) 
    { 
     DllObject.GetEligibleEmp(id); 
    } 
} 

// elsewhere in your code: 
IMyDllObject myDllObject = CreateMyDllObject(); // Factory method, can return test double 

// elsewhere elsewhere 
var eligibleEmp = myDllObject.GetEligibleEmp(id); 

Cela dit, ne pas le faire pour toutes les fonctions/classe/méthode dans la bibliothèque! Ce n'est probablement pas nécessaire. Ne doublez que les choses qui dépendent de ressources externes que vous ne pouvez pas contrôler dans un test unitaire comme les fichiers ou la communication réseau.

1

Si la méthode que vous essayez de stub est virtuelle, alors vous devriez être en mesure de stub est, mais si pas alors vous êtes le meilleur pari est de faire un wrapper autour de lui que vous pouvez stub.

Exemple:

internal class EmployeeWrapper 
{ 
    RealEmployeeFactory EmployeeFactory {get; set;} 

    public virtual RealEmployee GetEligibleEmp(int id) 
    { 
     return EmployeeFactory.GetEligibleEmp(id); 
    } 
} 

Je suis juste deviner la structure de votre classe parce que vous ne l'avez pas dans votre question, mais je pense que vous avez l'idée.

Ensuite, vous changer votre méthode comme ceci:

public string GetName(EmployeeWrapper employee, int id) 
{ 
    var eligibileEmp = employee.GetEligibleEmp(id); <---------you can stub this 

    if(eligibleEmp.Equals(empValue) 
    { 
     .......... 
    } 
} 
Questions connexes