2010-11-25 43 views
1

J'ai une méthode pour laquelle j'ai ajouté des tests unitaires dans un projet Web C#/ASP.Net. La méthode a été modifiée par quelqu'un d'autre pour inclure un appel à une méthode statique sur une classe qui enveloppe un HttpContext (pour ajouter un état de session), mais pendant le test je n'ai pas de HttpContext, donc cela renvoie une exception de référence nulle. Des idées pour contourner ce problème? Je ne veux pas faire trop de changements au code de production si je peux l'aider.Unité Test d'une classe avec un appel à une classe statique enveloppant un HttpContext

Méthode à l'essai:

public int MethodUnderTest() 
{ 
    ... 
    // Added line which breaks the tests 
    StaticClass.ClearSessionState(); 
} 

En StaticClass:

public void ClearSessionState() 
{ 
    HttpContext.Current.Session["VariableName"] = null; 
} 

Cela jette un NullReferenceException parce HttpContext.Current est nulle au cours des essais.

Répondre

0

En fin de compte, je pouvais retirer l'appel à StaticClass.ClearSessionState(), mais merci pour toutes les réponses. Trucs utiles.

1

Vous êtes à peu près dans une impasse ici en ce qui concerne les méthodes de tests unitaires qui utilisent HttpContext.Current. La bonne façon serait de modifier ce code pour utiliser l'injection de constructeur:

private readonly HttpContextBase _context; 
public Foo(HttpContextBase context) 
{ 
    _context = context; 
} 

public void ClearSessionState() 
{ 
    _context.Session["VariableName"] = null; 
} 

Maintenant vous pouvez railler cette HttpContextBase dans votre test unitaire.

1

Vous pouvez définir HttpContext.Current avec un objet mock/stub avant d'appeler la ligne StaticClass.ClearSessionState().

1

Vous pouvez faire votre propre dans le code de production « injection » statique comme ceci:

public static class StaticClass { 
    public void ClearSession() { 
     TheContext["VariableName"] = null; 
    } 

    public static HttpContextBase TheContext{ 
     get { 
      if (_context == null) 
       _context = new HttpContextWrapper(HttpContext.Current); 
      return _context; } 
     set { _context = value; } 
    } 
} 

Le test réel devient alors assez trivial, la propriété TheContext simplement définie sur une instance de talon avant le test. Par exemple, dans Moq tel talon pourrait être mis en place avec une ligne:

StaticClass.TheContext = new Mock<HttpContextBase>(){DefaultValue = DefaultValue.Mock}.Object;