簡體   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