MVC5验证的单元测试与万无一失 - 未实现的异常

时间:2015-06-18 15:24:31

标签: c# asp.net-mvc unit-testing foolproof-validation

我正在使用以下帮助方法对MVC中的验证逻辑进行单元测试:

public static void ValidateViewModel(Controller controller, object viewModelToValidate)
{
    var validationContext = new ValidationContext(viewModelToValidate, null, null);
    var validationResults = new List<ValidationResult>();
    Validator.TryValidateObject(viewModelToValidate, validationContext, validationResults, true);
    foreach (var validationResult in validationResults)
    {
        controller.ModelState.AddModelError(validationResult.MemberNames.FirstOrDefault() ?? string.Empty, validationResult.ErrorMessage);
    }
}

我的一个数据模型包含以下内容:

[NotMapped]
public string ValidSignupCode { get { return "VALID_SIGNUP_CODE"; } }

[MaxLength(15)]
[EqualTo("ValidSignupCode", ErrorMessage = "Sign up Code is not valid.")]
public string SignupCode { get; set; }

这会使用此stacktrace从Foolproof中抛出NotImplementedException:

   at Foolproof.ModelAwareValidationAttribute.IsValid(Object value)
   at System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(Object value, ValidationContext validationContext)
   at System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(Object value, ValidationContext validationContext)
   at System.ComponentModel.DataAnnotations.Validator.TryValidate(Object value, ValidationContext validationContext, ValidationAttribute attribute, ValidationError& validationError)
   at System.ComponentModel.DataAnnotations.Validator.GetValidationErrors(Object value, ValidationContext validationContext, IEnumerable`1 attributes, Boolean breakOnFirstError)
   at System.ComponentModel.DataAnnotations.Validator.GetObjectPropertyValidationErrors(Object instance, ValidationContext validationContext, Boolean validateAllProperties, Boolean breakOnFirstError)
   at System.ComponentModel.DataAnnotations.Validator.GetObjectValidationErrors(Object instance, ValidationContext validationContext, Boolean validateAllProperties, Boolean breakOnFirstError)
   at System.ComponentModel.DataAnnotations.Validator.TryValidateObject(Object instance, ValidationContext validationContext, ICollection`1 validationResults, Boolean validateAllProperties)

有趣的是,这在运行MVC时运行良好,但在UnitTest中却没有。

我的目标是通过MVC界面对测试验证和绑定进行单元测试,以确保随着项目规模的扩大,更改不会产生深远的影响。

非常感谢任何有关如何使其发挥作用的建议。

1 个答案:

答案 0 :(得分:1)

我最终从Codeplex下载了Foolproof代码以深入研究这个代码。

public override bool IsValid(object value)
{
    throw new NotImplementedException();
}

未实现调用的验证方法。我会在他们的留言板上联系,看看如何解决这个问题。