2012-09-01 18 views
7

Varlık IsValid olup olmadığını denetleyen bir çift sınama ile bir sınama sınıfı var. Kendi özel geçerliliğime sahip olmak için IValidatableObject'u kullanmaya devam ettim, ancak doğru doğrulama tekniğiyle takılıyorum.IValidatableObject doğrulama geçer ama StringLength geçersiz

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" }); 
    } 
} 

Eğer IsValid için testler testi görebileceğiniz gibiIsValidForPersistance arayarak:

[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); 
    } 
} 

Bu benim varlıktır:

Bu benim Testi sınıftır. Validate sonuçta daha fazla geçerliliğe sahip olacak.

Yukarıdaki testlerin hepsi bu yöntemi kullanarak geçer, ancak aşağıdaki bu test de geçer, ancak geçmemelidir. İşte

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

    // Act 
    student.Save(); 

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

Ben geçersiz uzunluk dizesi kendi Phone değerini ayarlıyorum. En az 10 karakterde StringLength ek açıklama kümesi nedeniyle doğrulama işleminin başarısız olmasını bekliyorum.

Bu neden geçiyor?

Güncelleştirme Özel doğrulama ile ilgili bir sorun oluştu, değişikliği kodla güncelleştirdik. özelliği üzerinde private değiştiricisine sahip olmama hakkındaki nemesv önerisiyle birlikte şimdi çalışıyor. Tüm kodu çalışmaya başladım.

+0

için yöntemin validateAllProperties parametresini ayarlamak gerekir vb StringLength gibi

Eğer tüm özelliklerini doğrulamak için gerekirse projesi. Proje, Validator ile çalışan bazı ekstra yardımcı sınıfları uygulamaktadır. http://www.codeproject.com/Articles/256183/DataAnnotations-Validation-for-Beginner –

cevap

13

Validator.TryValidateObjectsadeceRequiredAttribute s (ve ayrıca tip seviye özellikleri ve IValidatableObject uygulanması gibi diğer şeyler) varsayılan olarak denetler. Eğer şu anda bir demo olduğu gibi bu bağlantı haline arıyorum true

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

Kodumu güncelledim ve şimdi "validateAllProperties" değerinin true olarak ayarlanmasını sağladım, ancak yine de aynı sonucu elde ediyorum. Aynı test hala geçerliymiş gibi geçer –

+0

Kod size "validateAllProperties = true" ile çalışır. Telefon mülkünüzde değiştirdiğim tek şey kamu dizgisi Phone {private get; set; } 'Ben kamu aldım yani kamu dize olmalıyım Telefon {get; set; } ' – nemesv

İlgili konular