2010-12-09 2 views
4

Hier Teil einer Controller-Aktion ist:Modell wird nicht automatisch überprüft, wenn Unit-Tests

[HttpPost] 
public ActionResult NewComplaint(Complaint complaint) 
{ 
    if(!ModelState.IsValid) 
    { 
     // some code 
    } 
    // some more code... 
} 

Wenn die Anwendung ausgeführt wird, wird das Modell automatisch überprüft, bevor die if-Anweisung aufgerufen wird, auch. Wenn Sie jedoch versuchen, diesen Code Unit-Test zu testen, tritt die automatische Validierung nicht auf.

Wenn ich eine FormCollection verwenden und stattdessen TryUpdateModel aufrufen würde, würde die Validierung zwar stattfinden, aber ich möchte diese nicht verwenden.

Ich habe festgestellt, dass das Aufrufen von TryValidateModel (Modell) vor der If-Anweisung das Problem gut umgeht; nur eine zusätzliche Codezeile erforderlich. Ich würde es jedoch lieber loswerden.

Irgendwelche Ideen, warum die automatische Validierung nicht beim Komponententest auftritt, sondern wenn die Anwendung ausgeführt wird?

EDIT: Vergessen zu erwähnen, ich bin mit ASP.NET MVC3 RC1 und ich bin das Httpcontext-Objekt des Controllers spöttisch, ob das einen Unterschied macht

Antwort

4

Validierung während der Modell tritt Bindung (und TryUpdateModel führt Modell verbindlich).

Aber ich denke, das Problem ist, dass, was Sie versuchen zu testen ist das MVC-Framework (d. H. Die Tatsache, dass die Validierung vor einer Aktionsmethode aufgerufen wird). Du solltest das nicht testen.

Sie sollten davon ausgehen, dass dieser Teil funktioniert (weil wir es ausgiebig testen) und nur Ihren Anwendungscode testen. Also in diesem Fall, Sie das einzige, was zu verspotten brauchen, ist der Rückgabewert von ModelState.IsValid und Sie können manuell durch Hinzufügen eines Validierungsfehler tun:

ModelState.AddModelError("some key", "some error message") 
+0

Mann, jetzt bin dumm fühlen. Sollte das gerade getan oder verspottet haben. Während meiner Tests erstelle ich ein Objekt/formCollection mit allen notwendigen Eigenschaften/Einträgen, damit es die Validierung besteht, anstatt nur den ModelState über Mocks zu setzen. – xTRUMANx

+7

marcind, ich bekomme, dass das Testen des Frameworks für die meisten Komponententests nicht möglich ist. Tests sollten jedoch anzeigen, ob die richtigen Datenanmerkungen angegeben wurden. – wilk

Verwandte Themen