我正在尝试在最大长度为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
}
它说对象是有效的,即使不是。我在这里想念什么?
//...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");
}