2013-09-28 61 views
5

TryValidateObject dường như không hoạt động với thuộc tính xác thực mô hình Compare khi kiểm tra đơn vị.Kiểm thử đơn vị Mvc.Compare Thuộc tính trả về mô hình không chính xác isValid = true

Tôi nhận được ModelState.IsValid = true, khi tôi biết nó là false (khi kiểm tra đơn vị).

Tôi đã có mô hình ví dụ này:

public class CompareTestModel 
{ 
    public string Password { get; set; } 

    [System.Web.Mvc.Compare(
     "Password", 
      ErrorMessage = "The passwords do not match")] 
    public string PasswordCompare { get; set; } 
} 

Sử dụng phương pháp helper này để xác nhận mô hình khi kiểm tra đơn vị:

using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

public static class ModelHelper 
{ 
    public static void ValidateModel(
     this Controller controller, 
     object viewModel) 
    { 
     controller.ModelState.Clear(); 

     var validationContext = new ValidationContext(viewModel, null, null); 
     var validationResults = new List<ValidationResult>(); 

     Validator.TryValidateObject(
      viewModel, 
      validationContext, 
      validationResults, 
      true); 

     foreach (var result in validationResults) 
     { 
      foreach (var name in result.MemberNames) 
      { 
       controller.ModelState.AddModelError(name, result.ErrorMessage); 
      } 
     } 
    } 
} 

Và tôi chạy thử nghiệm đơn vị này:

[Test] 
    public void CompareAttributeTest() 
    { 
     // arrange 
     var model = new CompareTestModel(); 
     model.Password = "password"; 
     model.PasswordCompare = "different password"; 

     AccountController controller = new AccountController(); 

     // act 
     controller.ValidateModel(model); 

     // assert 
     Assert.IsFalse(controller.ModelState.IsValid); 
    } 

Trả lời

2

CompareAttribute không điền vào thuộc tínhcủa lớp MemberNames (xem source). Vì vậy, result.MemberNames của bạn sẽ trống.

Bởi vì nó không phải là cần thiết để sử dụng MemberNames tài sản (các ValidationResult thậm chí còn có một constructor cho việc này), do đó bạn cần phải thay đổi ValidateModel helper của bạn để đối phó với loại ValidationResult:

foreach (var result in validationResults) 
{ 
    if (result.MemberNames.Any()) 
    { 
     foreach (var name in result.MemberNames) 
     { 
      controller.ModelState.AddModelError(name, result.ErrorMessage); 
     } 
    } 
    else 
     controller.ModelState.AddModelError("", result.ErrorMessage); 
} 
Các vấn đề liên quan