Asp.net
單元測試 ASP.NET DataAnnotations 驗證
我正在使用 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 手動呼叫 ControllerValueProvider。那應該觸發驗證並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 => v.MemberNames.Contains("Email") && v.ErrorMessage.Contains("required"))); } private IList<ValidationResult> ValidateModel(object model) { var validationResults = new List<ValidationResult>(); var ctx = new ValidationContext(model, null, null); Validator.TryValidateObject(model, ctx, validationResults, true); return validationResults; }