2009-10-26 6 views
2

Je n'utilise pas Moq et je ne trouve pas le moyen de le faire. J'ai une méthode privée generateId, appeléMoq un proxy pour les tests unitaires

/// <summary> 
/// Generates a call Id for external interfaces 
/// </summary> 
/// <returns></returns> 
private string GenerateCallId() 
{ 
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString(); 
} 

Je voulais tester l'unité de cette méthode, et pour cette raison j'ai besoin de se moquer de la procuration. SharedServicesClientProxy est juste un objet qui implémente l'interface ISharedServices mais ajoute le singleton. Je voulais tester que toutes les chaînes renvoyaient correctement une chaîne commençant par "EX". ceci est mon test unitaire, en utilisant Moq

/// <summary> 
    /// A test for GenerateCallId 
    /// A CallId for external systems should always start by "EX" 
    ///</summary> 
    [TestMethod()] 
    [DeploymentItem("myDll.dll")] 
    public void GenerateCallIdTest() 
    { 
     myService_Accessor target = new myService_Accessor(); 
     var SharedServicesClientProxy = new Mock<ISharedServices>(); 
     SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286); 
     string actual; 
     string extCallIdPrefix = "EX"; 
     actual = target.GenerateCallId(); 
     Assert.IsTrue(actual.StartsWith(extCallIdPrefix)); 
    } 

Je suppose que je fais ma maquette au mauvais endroit?

D'une manière plus générale, comment puis-je imbriquer un objet qui va être appelé par la méthode que je suis en train de tester? pour par exemple:

 /// <summary> 
     /// dummy test 
     ///</summary> 
     [TestMethod()] 
     [DeploymentItem("myDll.dll")] 
     public void Foo() 
     { 
      myService_Accessor target = new myService_Accessor(); 
      boolexpected = false; 
      actual = target.Foo(); 
      Assert.IsTrue(actual,expected); 
     } 

     /// <summary> 
     /// Foo 
     /// </summary> 
     /// <returns></returns> 
     private bool Foo() 
     { 
      return this.Bar(); 
     } 

Je dois moq Bar, mais où je ne dois le faire? Merci, Seb

Répondre

6

Rechercher le terme "Injection de dépendances" avant de continuer.

Vous avez une dépendance sur SharedServicesClientProxy.Instance, qui est un singleton. Cela entraînera des problèmes avec l'isolation des tests, puisque vous réutiliserez la même instance à travers les tests et serez sujet aux problèmes d'état-restes.

Je vous conseille d'injecter des dépendances comme celui-ci (et OT- vous ne devriez pas tester des méthodes privées ... test via l'interface publique. Il est hors de mon système .. :)

public class AnonClass 
{ 
    ISharedServices _sharedServices; 
    AnonClass(ISharedServices sharedServicesObj) 
    { 
    _sharedServices = sharedServicesObj; 
    } 
    public string GenerateCallId() 
    { 
    return "EX" + _sharedServices.GenerateId().ToString(); 
    } 
} 

recâbler votre code actuel pour créer la classe cible comme celui-ci

var class = new AnonClass(SharedServicesClientProxy.Instance); 

dans votre essai, passer dans l'objet fictif au lieu de l'objet retourné par le Singleton