我使用ASP.NET MVC 3和DataAnnotations参与的项目。 我们在的ViewModels类DataAnnotations。
你怎么写这些验证单元测试?
视图模型例如:
public class AchievementVM
{
[Required(ErrorMessage = "The title field is required.")]
[StringLength(100, ErrorMessage = "Title must be 100 characters or less.")]
public string Title { get; set; }
}
谢谢!
在.NET框架提供了验证器类,可以行使你的隔离验证逻辑。 测试的代码看起来是这样的:
var achievement = new AchievementVM();
var context = new ValidationContext(achievement,
serviceProvider: null, items: null);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(achievement, context, results, true);
Assert.IsTrue(results.Any(vr => vr.ErrorMessage == "The title field is required."));
achievement.Title = "Really really long title that violates "
+ "the range constraint and should not be accepted as "
+ "valid input if this has been done correctly.";
Validator.TryValidateObject(achievement, context, results, true);
Assert.IsTrue(results.Any(vr => vr.ErrorMessage == "Title must be 100 characters or less."));
无需定制的实用程序来搜索的属性是否存在等。 Validator类做的工作对你和填充的ValidationResult集合一样的MVC架构。
这个方法的良好的书面记录上可以找到K.斯科特·艾伦的博客 。
由于这些注释都非常陈述,存在编写单元测试刚刚检查(使用反射),该方法被注解意义不大 - 测试也只是复制产品代码。 这仍然留下注释不被使用的框架,希望他们可以使用(也许他们是错误的注释,他们是在错误的地方,或者他们缺少一些额外的配置)的方式的可能性。
因此,一个有意义的测试将不会是一个单元测试,但一个集成测试,这使得确保系统正确地检测到的注释。 为了保持合理的速度,尽量让这些集成测试,集中地,通过实例少框架越好(这需要架构的深入了解-的RTFS )。 如果不出意外,最终到终端的测试可以通过解析HTML和检查,当被输入到字段无效数据显示验证错误检查正确使用注解。
它应该有必要写只是一对夫妇的集成/终端到终端的测试,以确保验证已启用。 不应该有需要每一个现场测试,当他们所有的工作方式相同。
在这里看到: 单元测试ASP.NET DataAnnotations验证
此外,您还可以使用反射来看看类的属性有任何必要的属性或没有。