2012-04-03 6 views
2

Ich habe den folgenden Code in meinem Controller-Aktion-Methode:Controller.User ist Null Während Unit Test

if (User.Identity.IsAuthenticated) 
{ 
    // ... 
} 

Es scheint gut zu funktionieren. Aber wenn ich einen Komponententest ausführen, der diese Aktion aufruft, schlägt es fehl, weil User null ist?

Kann jemand den besten Weg vorschlagen, damit umzugehen? Muss ich diesen Code nur für Komponententests umstrukturieren?

Antwort

3

Wahrscheinlich müssen Sie die Benutzereigenschaft als Teil Ihrer Einrichtung festlegen. Sie würden dies tun, indem Sie die HttpContextBase über ControllerContext spotten, die verwendet wird, um den Controller zu erstellen, so dass es Ihren verspotteten Benutzer zurückgibt. Setzen Sie Ihre Mocked ControllerContext in die ControllerContext Eigenschaft, und es wird User finden, sofern Sie das Objektdiagramm richtig konfiguriert haben.

2

Die User Eigenschaft der Controller Klasse aus den aktuellen HttpContext kopiert - Sie haben einen Kontext zu schaffen und die User dort in geeigneter Weise für diesen Satz in Ihren Unit-Tests zu arbeiten.

2

Benutzer wird null sein, wenn Sie den Code außerhalb des Kontexts einer Webanforderung ausführen. Es hört sich so an, als würden Sie Tests direkt mit Ihren Methoden durchführen.

Sie haben zwei Möglichkeiten.

Die schnellste Lösung für Ihr Problem, aber nicht unbedingt die nachhaltigste Lösung, wäre einfach Ihre laufende Website von Ihrem Komponententest als WebRequest aufzurufen.

Die nachhaltigere Lösung wäre, Ihre Verwendung von kontextabhängigen serverseitigen Funktionen (wie User) in einer einzigen Klasse zu sammeln, die Sie fälschen können.

bearbeiten

Kann jemand, der beste Weg vorschlagen, um damit umzugehen? Muss ich diesen Code nur für Komponententests umstrukturieren?

Die unterste Antwort ist "Ja". Noch wichtiger ist, dass Sie wahrscheinlich wollen, weil es Ihr System auf lange Sicht flexibler und/oder wartbarer macht.