ASP .Net MVC 3: Einheit, die Controller-Aktionen testet

8

Ich bin ziemlich neu in Unit Testing und Mock-Konzepten. Ich versuche herauszufinden, wie man einen guten Testfall für den Standard-Benutzerregistrierungscode schreibt:

%Vor%

Im Folgenden sind einige der spezifischen Punkte, wo ich Ihre Meinung / Hilfe brauche:

  1. Ich möchte nicht unbedingt einen neuen Benutzer in der ASP.Net-Mitgliedschaftsdatenbank erstellen.
  2. Wie kann ich anhand des übergebenen Modells wirklich sicherstellen, dass der Benutzer erfolgreich registriert wurde oder es zu Fehlern kam.
Moon 21.03.2012, 05:44
quelle

2 Antworten

25

Sie haben ein Problem mit Ihrem Code. Ihre Aktion hängt von einer statischen Methode ab: Membership.CreateUser . Und wie Sie wissen, sind statische Methoden PITAs zum Komponententest.

Sie könnten also die Kopplung schwächen, indem Sie eine Abstraktionsebene einführen:

%Vor%

und dann eine Implementierung, die den aktuellen Mitgliedschaftsanbieter verwendet:

%Vor%

und schließlich der Controller:

%Vor%

OK, jetzt, da wir die Kupplung geschwächt haben wir einen Mockframework nutzen könnten den Dienst in dem Unit-Test zu verspotten und es trivial machen.

Zum Beispiel mit Rhino Mocks Sie die folgenden Tests erstellen könnten die zwei Fehlerfälle abzudecken:

%Vor%

Der letzte Test ist der Erfolgsfall. Wir haben immer noch ein Problem damit. Das Problem ist die folgende Zeile:

%Vor%

Was ist das? Es handelt sich um einen statischen Methodenaufruf. So gehen wir auf die gleiche Weise, wie wir mit dem Mitgliedschaftsanbieter haben die Kopplung unserer Controller und das Formularauthentifizierungssystem zu schwächen.

    
Darin Dimitrov 21.03.2012, 07:41
quelle
0

Um diese Methode zu testen, können Sie zwei Wege folgen

  1. Erstellen Sie in der Testklasse eine neue Klasse, die von Membership class erbt und überschreiben Sie die Methode CreateUser.
  2. Benutze Moq, um die Klasse zu verspotten.

Im ersten Fall werde ich prüfen, ob der Benutzername "GoodUser" oder "BadUser" entspricht und einen MembershipCreateStatus.Success oder einen anderen Status generiert.

Für die Sekunde werde ich zwei Methoden aufstellen, die der gleichen Idee wie in der anderen Methode folgen. Einen Link finden Sie als Beispiel

    
Iridio 21.03.2012 06:09
quelle