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