2008-12-14 10 views
46

Ich arbeite mit einer ASP.NET MVC-Lösung in einer testgesteuerten Weise und ich möchte einen Benutzer mit Formularauthentifizierung an meine Anwendung anmelden. Der Code Ich mag würde mit in der Steuerung, um am Ende sieht ungefähr so ​​aus:Wie kann ich meinen ASP.NET MVC-Controller, der FormsAuthentication verwendet, testen?

FormsAuthentication.SetAuthCookie(userName, false); 

Meine Frage ist, wie kann ich einen Test schreibe diesen Code zu rechtfertigen?

Gibt es eine Möglichkeit zu überprüfen, ob die SetAuthCookie-Methode mit den richtigen Parametern aufgerufen wurde?

Gibt es eine Möglichkeit, eine falsche/falsche FormsAuthentication zu injizieren?

Antwort

66

ich durch das Schreiben eine Schnittstelle und eine Wrapper-Klasse beginnen würde, die diese Logik kapseln und dann die Schnittstelle in meinem Controller verwenden:

public interface IAuth 
{ 
    void DoAuth(string userName, bool remember); 
} 

public class FormsAuthWrapper : IAuth 
{ 
    public void DoAuth(string userName, bool remember) 
    { 
     FormsAuthentication.SetAuthCookie(userName, remember); 
    } 
} 

public class MyController : Controller 
{ 
    private readonly IAuth _auth; 

    public MyController(IAuth auth) 
    { 
     _auth = auth; 
    } 

} 

Jetzt IAuth leicht in einem Gerät zu testen verspottet werden kann, und überprüfen, ob die Controller ruft die erwarteten Methoden darauf auf. Ich würde NICHT Einheit FormsAuthWrapper Klasse testen, weil es nur den Anruf an die FormsAuthentication delegiert, die tut, was es tun soll (Microsoft garantieren :-)).

+2

+1 auf diese, nicht die Frameworks anderer Leute testen, nur Ihre Verwendung von ihnen. Wir machen die gleiche (ähnliche) Sache in unserer App (wrap FormsAuth Zeug, etc.) – chadmyers

+18

* seufz * Microsoft ist so stolz auf dieses Framework SO testbar! Ich hatte gehofft, dass da ein eingebauter Weg war, um dies zu verspotten, ohne zu verpacken. Raten Sie nicht :( – maz

+6

Das Problem ist nicht, dass das Framework nicht testbar ist ... das Problem ist, dass die FormsAuthentication-Klasse vor dem Unit-Testing-Design von MVC. Wie Darin die beste Weise erwähnt hat, ist dies zu entkoppeln Controller von der Klasse mit den statischen Methoden mit einer Schnittstelle – Jesse

Verwandte Themen