2009-08-20 4 views
1

Ich habe mein Fake-Objekt für HttpRequest bereit (ein Wrapper und eine Schnittstelle) ... da ich keinen Konstruktor aufrufen muss, wie übergebe ich die gefälschte HttpRequest, ohne die Schnittstelle dieser Methode zu brechen?Wie Unit-Test eine statische Methode mit einem gefälschten Objekt für die Abhängigkeit testen?

public static int ParseQueryInt(string key, int defaultValue) 
{ 
    NameValueCollection nvc; 
    if (HttpContext.Current.Request.QueryString["name"] != null) 
    { 
     //Parse strings. 
    } 
} 

EDIT: Akselson Lösung ist die kreativste und dies Proof of Concept gearbeitet, viel zu meiner Überraschung, obwohl ich auch Skeet-Lösung verwendet, da es wahrscheinlicher aussieht in allen Situationen zu arbeiten.

public class Class1 
{ 
    [Test] 
    public void Test() 
    { 
     HttpContext.Current = new HttpContext(
new HttpRequest("test.aspx", "http://test.com/test.aspx", "querystring=value"), 
new HttpResponse(new StringWriter()) 
); 
     Assert.AreEqual(HttpContext.Current.Request.QueryString["querystring"], "value"); 
    } 
} 

Antwort

4

Sie können HttpContext.Current auf Ihre eigene Instanz festgelegt:

HttpContext.Current = new HttpContext(
    new HttpRequest("test.aspx","http://test.com/test.aspx","querystring=value"), 
    new HttpResponse(new StringWriter()) 
); 

Es könnte nützlich sein, wenn Sie nicht wollen, die Methode zu ändern, bevor Sie es im Test haben.

7

Eine Option ist eine weitere Überlastung vorstellen:

public static int ParseQueryInt(string key, int defaultValue) 
{ 
    return ParseQuery(key, defaultValue, HttpContext.Current.Request); 
} 

public static int ParseQueryInt(string key, int defaultValue, 
           HttpRequest request) 
{ 
    NameValueCollection nvc; 
    if (request.QueryString["name"] != null) 
    { 
     //Parse strings. 
    } 
} 

Sie dann Ihre „nicht überprüfbar“ reduzieren (oder zumindest „schwer zu testen“) Code auf eine einfache Umleitung ... können Sie den Test hacken Sie aus der Version, die eine Anfrage akzeptiert.

+0

Wau, das war schnell! Und du hast meine Gedanken gelesen :) –

+6

Du könntest die zweite Überladung intern machen und sie aus der Test Assembly über das InternalsVisibleTo Attribut benutzen. Sie können Ihre API daher nicht für Unit-Testzwecke verwenden. –

Verwandte Themen