Модульный тест MaxLengthAttribute завершается неудачно - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь проверить проверку аннотаций данных на модели, максимальная длина которой составляет 25 символов.

У меня есть эта модель:

public class ContactRequest
{
    [MaxLength(25, ErrorMessage = "String exceeds maximum length of 25")]
    public string DisplayName { get; set; }
}

Но этот модульный тест не пройден:

[Test]
public void Max25CharsTest()
{
    // Arrange
    var stringBuilder = new StringBuilder("a");

    for (var i = 0; i < 25; i++)
    {
        stringBuilder.Append("a");
    }

    var model = new ContactRequest { DisplayName = stringBuilder.ToString() };
    var context = new ValidationContext(model);

    var results = new List<ValidationResult>();

    // Act
    var actual = Validator.TryValidateObject(model, context, results);

    // Assert
    Assert.True(actual, "Expects validation to pass");

    // Append characters
    stringBuilder.Append("asdf");
    model.DisplayName = stringBuilder.ToString();
    results.Clear();
    actual = Validator.TryValidateObject(model, context, results);
    Assert.False(actual, "Expects validation to fail"); // Fails here
}

Он говорит, что объект действителен, хотя это не так. Что мне здесь не хватает?

1 Ответ

1 голос
/ 01 октября 2019
//...omitted for brevity

// Append characters
stringBuilder.Append("asdf");
model.DisplayName = stringBuilder.ToString() ;            
results.Clear();
actual = Validator.TryValidateObject(model, context, results, validateAllProperties: true);
Assert.IsFalse(actual, "Expects validation to fail");

Обратите внимание на флаг validateAllProperties, установленный на true. Это указывает валидатору проверять все свойства, так как имя подразумевает

true для проверки всех свойств; если ложь, проверяются только обязательные атрибуты ..

акцент шахты

Применительно к первомучасть теста завершится неудачей, поскольку цикл for переходит от 0 до 25, а в строителе строк уже есть символ.

Он проходит, как и ожидалось

public void Max25CharsTest() {
    // Arrange
    var stringBuilder = new StringBuilder("a");

    for (var i = 0; i < 24; i++) { //<-- changed this to 24
        stringBuilder.Append("a");
    }

    var model = new ContactRequest { DisplayName = stringBuilder.ToString() };
    var context = new ValidationContext(model);
    var results = new List<ValidationResult>();

    // Act
    var actual = Validator.TryValidateObject(model, context, results, validateAllProperties: true);

    // Assert
    Assert.IsTrue(actual, "Expects validation to pass");

    // Append characters
    stringBuilder.Append("asdf");
    model.DisplayName = stringBuilder.ToString();
    results.Clear();
    actual = Validator.TryValidateObject(model, context, results, validateAllProperties: true);
    Assert.IsFalse(actual, "Expects validation to fail");
}

Ссылка TryValidateObject(Object, ValidationContext, ICollection<ValidationResult>, Boolean)

Этот метод оценивает каждый экземпляр ValidationAttribute, который присоединен к типу объекта. Он также проверяет, предоставляется ли каждое свойство, помеченное с помощью RequiredAttribute. Он проверяет значения свойств объекта, если validateAllProperties имеет значение true, но не рекурсивно проверяет свойства объектов, возвращаемых свойствами.

...