Testen der ASP.NET MVC 3-Authentifizierung bei Verwendung der Mitgliedschaft

8

Ich möchte meine AccountController testen. Das Problem ist, dass ich in Register Methode die nächste Zeile verwenden, um den Benutzer zu erstellen:

%Vor%

In der Webanwendung verwende ich ein CustomMembershipProvider , das ich mit web.config eingestellt habe. In meiner Unit Test Mitgliedschaft Klasse in Standard SqlMembershipProvider . Und nicht mein CustomMembershipProvider , das ich in meiner App verwende.

Wie kann ich die Mitgliedschaft im Komponententest-Kontext einrichten? Ich meine, es programmatisch einzurichten, wie ASP net es nach dem Lesen der Datei web.config festgelegt.

Ich benutze bereits eine Schnittstelle, um die Benutzerverwaltungs-Datenebene zu verspotten, aber ich dachte darüber nach, ob es in diesem Fall eine Möglichkeit gibt, die Schnittstelle zu vermeiden. So können Sie eine Scheinimplementierung der Mitgliedschaft im Komponententest einrichten.

%Vor%     
Radu D 05.02.2012, 19:22
quelle

3 Antworten

8

Definieren Sie eine Mitgliedschaftsschnittstelle, etwa so:

%Vor%

... implementieren Sie es für Ihre MVC-Anwendung wie folgt:

%Vor%

... dann injiziere es in deinen Controller und benutze es so:

%Vor%

ASP.NET verwendet statische Klassen wie Membership für eine Reihe von Dingen, aber der Zugriff auf statische Klassen erschwert immer das Komponententesten. Die Standardlösung besteht darin, eine Schnittstelle für den Service zu definieren, sie mithilfe der statischen ASP.NET-Klasse zu implementieren und sie in Ihre Controller zu integrieren.

Sie können die Injektion einrichten (falls noch nicht geschehen), indem Sie einen Standard DependencyResolver und einen DI-Container wie Unity .

    
Steve Wilkes 05.02.2012, 20:27
quelle
2

Ich habe einen strukturierteren Mitgliedschaftsanbieter erstellt, der in drei verschiedene Schnittstellen unterteilt wurde (und der Anbieter löst sie mit DependencyResolver auf).

Es erleichtert das Testen des Anbieters. Testen Sie einfach Ihre Implementierung von IAccountRepository .

Sie können darüber lesen: Ссылка

oder installieren Sie einfach das Paket nuget:

%Vor%     
jgauffin 06.02.2012 08:59
quelle
0

Ihr Komponententest des Controllers sollte nicht Ihren CustomMembershipProvider oder den Standard-SQL-Provider verwenden. Wenn Sie einen Komponententest durchführen, sollten Sie einen Stub / Fake verwenden, damit Sie die vollständige Kontrolle darüber haben, was zurückgegeben wird. Wenn Sie den echten Anbieter im Test verwenden, ist es kein Unit-Test mehr, sondern ein Integrationstest.

Um die Unit-Testbarkeit zu erreichen, müssen Sie einen Fake-Provider definieren, indem Sie entweder ein Mocking-Framework verwenden oder indem Sie eine Fälschung mit "Dosen" -Ergebnissen manuell rollen lassen. Die Fälschung könnte in etwa so aussehen:

%Vor%

Lassen Sie den Controller den Provider als ein Ctor-Argument

nehmen %Vor%

Im Komponententest möchten Sie die Fälschung entsprechend dem, was Sie testen möchten, einrichten, und Sie können das Ergebnis, das Sie für jedes Registrierungsergebnis erwarten, bestätigen:

%Vor%

Da der MemberShipProvider ziemlich groß ist und Sie wahrscheinlich nicht alles verwenden werden, kann es sinnvoll sein, @SteveWilkes zu verwenden, um stattdessen die Membership-Klasse zu umhüllen, um eine kleinere, zielgerichtetere Schnittstelle zu erstellen. Auch ein spöttisches Framework erspart Ihnen viel Arbeit. Um Ihren Controller mit der neuen Abhängigkeit zu verbinden, müssen Sie eine neue ControllerFactory erstellen.

    
PHeiberg 05.02.2012 22:56
quelle