2010-11-25 9 views
1

Ich habe eine Methode, der Unit-Tests in einem C#/ASP.Net-Webprojekt hinzugefügt wurden. Die Methode wurde von jemand anderem geändert, um einen Aufruf einer statischen Methode für eine Klasse einzubeziehen, die einen HttpContext umschließt (um einen Sitzungszustand hinzuzufügen), aber während des Testens habe ich keinen HttpContext, daher wird eine Nullreferenzausnahme ausgelöst. Irgendwelche Ideen, wie man dieses Problem umgehen kann? Ich möchte nicht zu viele Änderungen am Produktionscode vornehmen, wenn ich ihm helfen kann.Unit Testen einer Klasse mit einem Aufruf einer statischen Klasse, die einen HttpContext umhüllt

Methode unter Test:

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

In StaticClass:

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

Dies wirft ein NullReferenceException weil HttpContext.Current während des Testens null ist.

Antwort

0

Am Ende kann ich entfernen Sie einfach den Anruf an StaticClass.ClearSessionState(), aber danke für die Antworten. Nützliches Zeug.

1

Sie sind hier ziemlich in einer Sackgasse, wenn Unit-Testmethoden, die HttpContext.Current verwenden, betroffen sind. Der richtige Weg wäre diesen Code zu ändern Konstruktor Injektion zu verwenden:

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

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

Jetzt können Sie diese HttpContextBase in Ihrem Unit-Test verspotten.

1

Sie könnten HttpContext.Current mit einem Mock/Stub-Objekt vor dem Aufruf der StaticClass.ClearSessionState() Zeile festlegen.

1

Sie könnten wie so Ihre eigene statische „Injektion“ in der Produktion Code tun:

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; } 
    } 
} 

Der eigentliche Test wird dann ziemlich trivial, geben Sie einfach TheContext Eigenschaft auf eine Stub-Instanz vor dem Test. Zum Beispiel in Moq solchen Stummel mit einer Zeile aufgebaut werden könnte:

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