2012-08-06 9 views
14

Ich nehme an einem Projekt mit ASP.NET MVC 3 und DataAnnotations teil. Wir haben DataAnnotations in ViewModels-Klassen.TDD: Was ist die beste Vorgehensweise zum Testen von DataAnnotations in ASP.NET MVC 3?

Wie schreiben Sie Komponententests für diese Validierungen?

Ansichtsmodell Beispiel:

public class AchievementVM 
{ 
    [Required(ErrorMessage = "The title field is required.")] 
    [StringLength(100, ErrorMessage = "Title must be 100 characters or less.")] 
    public string Title { get; set; } 
} 

Dank!

+1

Was machen diese Datenanmerkungen? Ist es Validierung oder etwas anderes? –

+0

Es markiert eine Komponente, die validiert werden soll. Ein praktisches Beispiel für die manuelle Validierung mit Datenannotationen: http://odetocode.com/blogs/scott/archive/2011/06/29/manual-validation-with-data-annotations.aspx –

Antwort

3

Da diese Annotationen sehr deklarativ sind, hat es wenig Sinn, Komponententests zu schreiben, die einfach (mit Reflektion) überprüfen, dass die Methoden kommentiert sind - die Tests würden nur den Produktionscode duplizieren. Und das würde immer noch die Möglichkeit lassen, dass die Annotationen nicht so verwendet werden, wie das Framework sie erwartet (vielleicht sind sie die falschen Annotationen, sie sind am falschen Ort, oder ihnen fehlt eine zusätzliche Konfiguration).

Ein aussagekräftiger Test wäre also kein Komponententest, sondern ein Integrationstest, der sicherstellt, dass das System die Annotationen korrekt erkennt. Um die Geschwindigkeit vernünftig zu halten, versuchen Sie, diese Integrationstests so fokussiert wie möglich zu gestalten, indem Sie so wenig wie möglich vom Framework instanziieren (was eine gründliche Kenntnis des Frameworks voraussetzt - RTFS). Nicht zuletzt könnte ein End-to-End-Test die korrekte Verwendung der Annotationen überprüfen, indem der HTML-Code analysiert und überprüft wird, ob die Validierungsfehler angezeigt werden, wenn ungültige Daten in die Felder eingegeben werden.

Es sollte nur ein paar Integrations/Ende-zu-Ende-Tests geschrieben werden, um sicherzustellen, dass die Validierung aktiviert wurde. Es sollte nicht notwendig sein, jedes Feld zu testen, wenn alle gleich funktionieren.

15

Das .NET-Framework wird mit einer Validator-Klasse geliefert, die Ihre Validierungslogik isoliert ausführen kann. Der zu testende Code könnte wie folgt aussehen:

Keine benutzerdefinierten Dienstprogramme zum Suchen nach Attributen. Die Validator-Klasse übernimmt die Arbeit für Sie und füllt eine ValidationResult-Auflistung genauso wie die MVC-Infrastruktur.

Eine gute Beschreibung dieser Methode finden Sie unter K. Scott Allen's blog.

+0

Große Antwort. Dies ist der perfekte Weg zum Komponententest. Ich kann überprüfen, ob die Validierung stattgefunden hat, ohne manuell angeben zu müssen, was sie prüft. –

+1

Ich würde empfehlen, 'results.Clear()' Sammlung vor der erneuten Verwendung in 'TryValidationObject()'. –