Asp.net

單元測試 ASP.NET DataAnnotations 驗證

  • January 30, 2010

我正在使用 DataAnnotations 進行模型驗證,即

[Required(ErrorMessage="Please enter a name")]
public string Name { get; set; }

在我的控制器中,我正在檢查 ModelState 的值。對於從我的視圖發布的無效模型數據,這正確返回 false。

但是,在執行我的控制器操作的單元測試時,ModelState 總是返回 true:

[TestMethod]
public void Submitting_Empty_Shipping_Details_Displays_Default_View_With_Error()
{
   // Arrange
   CartController controller = new CartController(null, null);
   Cart cart = new Cart();
   cart.AddItem(new Product(), 1);

   // Act
   var result = controller.CheckOut(cart, new ShippingDetails() { Name = "" });

   // Assert
   Assert.IsTrue(string.IsNullOrEmpty(result.ViewName));
   Assert.IsFalse(result.ViewData.ModelState.IsValid);
}

我需要做任何額外的事情來在我的測試中設置模型驗證嗎?

謝謝,

Ben

驗證將由ModelBinder. 在範例中,您ShippingDetails自己建構,這將完全跳過ModelBinder驗證。請注意輸入驗證和模型驗證之間的區別。輸入驗證是為了確保使用者提供了一些數據,假設他有機會這樣做。如果您提供的表單沒有關聯欄位,則不會呼叫關聯的驗證器。

MVC2 在模型驗證與輸入驗證方面發生了變化,因此確切的行為取決於您使用的版本。有關 MVC 和 MVC 2 的詳細資訊,請參閱<http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html>。

[編輯] 我想最乾淨的解決方案是UpdateModel在測試時通過提供自定義 mock 手動呼叫 Controller ValueProvider。那應該觸發驗證並ModelState正確設置。

我在我的部落格文章中發布了這個:

using System.ComponentModel.DataAnnotations;

// model class
public class Fiz
{
   [Required]
   public string Name { get; set; }

   [Required]
   [RegularExpression(".+@..+")]
   public string Email { get; set; }
}

// in test class
[TestMethod]
public void EmailRequired()
{
   var fiz = new Fiz 
       {
           Name = "asdf",
           Email = null
       };
   Assert.IsTrue(ValidateModel(fiz).Any(
       v =&gt; v.MemberNames.Contains("Email") && 
            v.ErrorMessage.Contains("required")));
}

private IList&lt;ValidationResult&gt; ValidateModel(object model)
{
   var validationResults = new List&lt;ValidationResult&gt;();
   var ctx = new ValidationContext(model, null, null);
   Validator.TryValidateObject(model, ctx, validationResults, true);
   return validationResults;
}

引用自:https://stackoverflow.com/questions/2167811