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