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.
için yöntemin
validateAllProperties
parametresini ayarlamak gerekir vbStringLength
gibiEğ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 –