2012-09-01 12 views
7

Ich habe eine Testklasse mit ein paar Tests, die überprüfen, ob die Entität IsValid. Ich bin dazu übergegangen, IValidatableObject von meiner eigenen benutzerdefinierten Validierung zu verwenden, aber ich bin mit der korrekten Validierungstechnik festgefahren.IValidatableObject übergibt Validierung aber StringLength ist ungültig

Dies ist mein Test-Klasse:

[TestFixture] 
public class StudentTests { 
    private static Student GetContactWithContactInfo() 
    { 
     return new Student(new TestableContactRepository()) 
          { 
           Phone = "7275551111" 
          }; 
    } 

    private static Student GetContactWithoutContactInfo() 
    { 
     return new Student(new TestableContactRepository()); 
    } 

    [Test] 
    public void Student_Saving_StudentHasInfo_IsValid() 
    { 
     // Arrange 
     Student student = GetContactWithContactInfo(); 
     // Act 
     student.Save(); 
     // Assert 
     Assert.IsTrue(student.IsValid); 
    } 

    [Test] 
    public void Student_Saving_StudentDoesNotHaveInfo_IsNotValid() 
    { 
     // Arrange 
     Student student = GetContactWithoutContactInfo(); 
     // Act 
     student.Save(); 
     // Assert 
     Assert.IsFalse(student.IsValid); 
    } 
} 

Das ist meine Einheit:

public class Student : IValidatableObject 
{ 
    private readonly IContactRepository contactRepository; 

    public Student(IContactRepository _contactRepository) 
    { 
     contactRepository = _contactRepository; 
     Contacts = new List<Student>(); 
    } 

    [Required] 
    public int Id { get; private set; } 

    [StringLength(10, MinimumLength = 10)] 
    public string Phone { get; set; } 


    public List<Student> Contacts { get; private set; } 

    public bool IsValid { get; private set; } 

    public void Save() 
    { 
     if (IsValidForPersistance()) 
     { 
      IsValid = true; 
      Id = contactRepository.Save(); 
     } 
    } 

    private bool IsValidForPersistance() 
    { 
     return Validator.TryValidateObject(this, new ValidationContext(this), null, true); 
    } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (string.IsNullOrEmpty(Phone) && Contacts.All(c => string.IsNullOrEmpty(c.Phone))) 
      yield return new ValidationResult("The student or at least one contact must have a phone number entered", new[] { "Phone Number" }); 
    } 
} 

Wie Sie die Tests Test für IsValid durch die IsValidForPersistance Aufruf sehen. Validate wird schließlich mehr Validierung haben.

Die obigen Tests bestehen alle mit dieser Methode, aber dieser Test wird auch bestanden, sollte aber nicht.

[Test] 
public void Student_Saving_HasContactInfoWithInvalidLength_IsNotValid() 
{ 
    // Arrange 
    Contact student = GetContactWithoutContactInfo(); 
    student.Phone = "string"; 

    // Act 
    student.Save(); 

    // Assert 
    Assert.IsFalse(student.IsValid); 
} 

Hier bin ich mein eigenes Phone Wert einer ungültigen Zeichenfolge zu setzen. Ich erwarte, dass die Validierung aufgrund der StringLength Annotation bei min und max 10 Zeichen fehlschlägt.

Warum passiert das?

Aktualisieren Es gab ein Problem mit der benutzerdefinierten Überprüfung, aktualisiert den Code mit der Änderung. Zusammen mit dem Vorschlag von nemesv, keinen private Modifikator auf der Phone Eigenschaft zu haben, funktioniert es jetzt. Ich habe den ganzen Code zum Arbeiten aktualisiert.

+0

setzen müssen validieren Ich suche in diesen Link jetzt, da es eine Demo hat Projekt. Das Projekt implementiert einige zusätzliche Hilfsklassen, die mit dem Validator arbeiten. http://www.codeproject.com/Articles/256183/DataAnnotations-Validation-for-Beginner –

Antwort

13

Validator.TryValidateObjectprüft nur die RequiredAttribute s (und auch andere Dinge wie Typ-Ebene Attribute und IValidatableObject Implementierung) standardmäßig aktiviert.

Wenn benötigen Sie alle Attribute wie StringLength usw. Sie den validateAllProperties Parameter der Methode zu true

private bool IsValidForPersistance() { 
    return Validator.TryValidateObject(this, 
             new ValidationContext(this), 
             null, 
             true /* validateAllProperties */); 
} 
+0

Ich habe meinen Code aktualisiert und habe den 'validateAllProperties' Wert jetzt auf True gesetzt, aber ich bekomme immer noch das gleiche Ergebnis. Derselbe Test läuft noch, als ob er gültig wäre. –

+0

Du Code funktioniert für mich mit 'validateAllProperties = true'. Nur eine Sache habe ich in Ihrer Phone-Eigenschaft geändert: public string Phone {private get; einstellen; } 'Ich habe das veröffentlicht, also sollte es' öffentliche Schnur Telefon sein {erhalten; einstellen; } ' – nemesv

Verwandte Themen