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.
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 –