【问题标题】:TDD: What is best practice to test DataAnnotations in ASP.NET MVC 3?TDD:在 ASP.NET MVC 3 中测试 DataAnnotations 的最佳实践是什么?
【发布时间】:2012-08-03 20:29:29
【问题描述】:

我正在参与一个使用 ASP.NET MVC 3 和 DataAnnotations 的项目。我们在 ViewModels 类中有 DataAnnotations。

您如何为这些验证编写单元测试?

ViewModel 示例:

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; }
}

谢谢!

【问题讨论】:

标签: asp.net-mvc unit-testing tdd data-annotations


【解决方案1】:

.NET 框架带有一个Validator 类,它可以单独运行您的验证逻辑。要测试的代码可能如下所示:

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 类为您完成工作并填充与 MVC 基础结构相同的 ValidationResult 集合。

可以在K. Scott Allen's blog 上找到有关此方法的精彩文章。

【讨论】:

  • 很好的答案。这是单元测试的完美方式。我可以验证是否发生了验证,而无需手动指定验证它的内容。
  • TryValidationObject() 再次使用之前,我会推荐results.Clear() 收藏。
【解决方案2】:

由于这些注释是非常声明性的,因此编写单元测试来检查(通过反射)方法是否已注释几乎没有意义 - 测试只是复制生产代码。这仍然会留下注释没有按照框架期望的方式使用的可能性(可能它们是错误的注释,它们位于错误的位置,或者它们缺少一些额外的配置)。

因此,有意义的测试不是单元测试,而是确保系统正确检测注释的集成测试。为了保持速度合理,尝试通过尽可能少地实例化框架(这需要深入了解框架 - RTFS)来使这些集成测试尽可能集中。如果不出意外,端到端测试可以通过解析 HTML 并检查在字段中输入无效数据时是否显示验证错误来检查注释的正确使用。

应该只需要编写几个集成/端到端测试来确保验证已启用。当它们都以相同的方式工作时,不需要测试每个字段。

【讨论】:

    【解决方案3】:

    请看这里:Unit Testing ASP.NET DataAnnotations validation

    此外,您可以使用反射来查看类的属性是否具有任何必要的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2011-08-16
      • 2019-03-16
      相关资源
      最近更新 更多