【发布时间】:2015-06-18 15:24:30
【问题描述】:
我正在使用以下辅助方法在 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; }
这会使用此堆栈跟踪从 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 接口对验证和绑定进行单元测试,以确保随着项目变得越来越大,更改不会产生深远的影响。
非常感谢任何有关如何使其工作的建议。
【问题讨论】:
-
听起来您引用了两个不同版本的 Foolproof。去查找 dll 的每个副本并检查它。如果您没有发现不匹配的版本,请使用融合日志记录。
-
我刚刚验证了我的所有项目(ViewModel、MVC、MVCTest)都引用了相同版本的 Foolproof。
-
怎么样?通过定位磁盘上的每个副本并使用反编译器来检查它?通过使用融合日志来查看它的加载位置?当你有一些奇怪的事情发生时,这就是你需要做的。从底部开始。
-
我通过VS验证了版本号。我还删除了所有的 bin 文件夹,以便在运行测试之前磁盘上只存在一个“MVC Foolproof Validation.dll”文件,但它仍然失败。在 MVC 中运行良好。
-
“在 MVC 中运行良好”是什么意思?在运行时工作?在同一台机器上,还是在某处的服务器上?
标签: c# asp.net-mvc unit-testing foolproof-validation