繁体   English   中英

MaxLengthAttribute 的单元测试失败

[英]Unit Test of MaxLengthAttribute fails

我正在尝试在最大长度为 25 个字符的 model 上测试数据注释验证。

我有这个 model:

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
}

它说 object 是有效的,即使它不是。 我在这里想念什么?

//...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 验证所有属性; 如果为 false,则仅验证必需的属性..

强调我的

如果应用于测试的第一部分,它将失败,因为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)

此方法评估附加到 object 类型的每个 ValidationAttribute 实例。 它还检查是否提供了标记为RequiredAttribute 的每个属性。 如果 validateAllProperties 为真,它会验证 object 的属性值,但不会递归地验证属性返回的对象的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM