TDD:什么是ASP.NET MVC 3测试DataAnnotations最佳做法?(TDD: Wh

2019-07-30 19:51发布

我使用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; }
}

谢谢!

Answer 1:

在.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.斯科特·艾伦的博客 。



Answer 2:

由于这些注释都非常陈述,存在编写单元测试刚刚检查(使用反射),该方法被注解意义不大 - 测试也只是复制产品代码。 这仍然留下注释不被使用的框架,希望他们可以使用(也许他们是错误的注释,他们是在错误的地方,或者他们缺少一些额外的配置)的方式的可能性。

因此,一个有意义的测试将不会是一个单元测试,但一个集成测试,这使得确保系统正确地检测到的注释。 为了保持合理的速度,尽量让这些集成测试,集中地,通过实例少框架越好(这需要架构的深入了解-的RTFS )。 如果不出意外,最终到终端的测试可以通过解析HTML和检查,当被输入到字段无效数据显示验证错误检查正确使用注解。

它应该有必要写只是一对夫妇的集成/终端到终端的测试,以确保验证已启用。 不应该有需要每一个现场测试,当他们所有的工作方式相同。



Answer 3:

在这里看到: 单元测试ASP.NET DataAnnotations验证

此外,您还可以使用反射来看看类的属性有任何必要的属性或没有。



文章来源: TDD: What is best practice to test DataAnnotations in ASP.NET MVC 3?