[英]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.