2012-09-01 9 views
7

मेरे पास दो परीक्षणों के साथ एक टेस्ट क्लास है जो यह देखने के लिए जांचती है कि इकाई IsValid है या नहीं। मैं अपनी खुद की कस्टम सत्यापन होने से IValidatableObject का उपयोग करने के लिए चला गया लेकिन मैं सही सत्यापन तकनीक से फंस गया हूं।IValidatableObject प्रमाणीकरण पास करता है लेकिन स्ट्रिंग लम्बाई अमान्य

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

आप IsValid के लिए परीक्षण परीक्षण देख सकते हैं IsValidForPersistance फोन करके:

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

यह मेरा इकाई है:

यह मेरा टेस्ट वर्ग है। Validate अंततः अधिक सत्यापन होगा।

उपर्युक्त परीक्षण सभी इस विधि का उपयोग करके पास करते हैं लेकिन नीचे दिया गया यह परीक्षण भी गुजरता है लेकिन नहीं करना चाहिए।

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

    // Act 
    student.Save(); 

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

यहाँ मैं गलत लंबाई स्ट्रिंग के अपने ही Phone मान सेट कर रहा हूँ। मैं StringLength एनोटेशन सेट मिनट और अधिकतम 10 वर्णों के कारण सत्यापन विफल होने की अपेक्षा करता हूं।

यह क्यों गुजर रहा है?

अद्यतन कस्टम सत्यापन के साथ कोई समस्या थी, परिवर्तन के साथ कोड अपडेट किया गया। Phone संपत्ति पर private संशोधक नहीं होने के बारे में nemesv से सुझाव के साथ यह अब काम करता है। मैंने काम करने के लिए सभी कोड अपडेट कर दिए हैं।

+0

को विधि के validateAllProperties पैरामीटर निर्धारित करने की आवश्यकता मैं इस लिंक में अभी यह एक डेमो के रूप में देख रहा हूँ परियोजना। परियोजना वैलिडेटर के साथ काम करने वाले कुछ अतिरिक्त सहायक कक्षाओं को लागू करती है। http://www.codeproject.com/Articles/256183/DataAnnotations- प्रमाणीकरण-for- निर्माता –

उत्तर

13

Validator.TryValidateObjectकेवल जाँच करता हैRequiredAttribute (और भी प्रकार के स्तर का गुण और IValidatableObject कार्यान्वयन की तरह अन्य बातों के) डिफ़ॉल्ट रूप से।

आप सभी विशेषताओं को मान्य करने की जरूरत हैStringLength की तरह आदि आप true

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

मैंने अपना कोड अपडेट कर लिया है और अब 'validateAllProperties' मान सही पर सेट है लेकिन मुझे अभी भी एक ही परिणाम मिल गया है। वही परीक्षण अभी भी गुजरता है जैसे यह मान्य है –

+0

आप कोड मेरे लिए 'validateAllProperties = true' के साथ काम करता है। केवल एक चीज जो मैंने आपके फोन प्रॉपर्टी में बदल दी है 'पब्लिक स्ट्रिंग फोन {निजी हो; सेट; } 'मैंने जनता को सार्वजनिक कर दिया है, इसलिए यह' सार्वजनिक स्ट्रिंग फोन {होना चाहिए; सेट; } ' – nemesv

संबंधित मुद्दे