2011-06-22 45 views
0

这是对这个跟进:测试控制器方法+ DataAnnotations - asp.net的MVC 3

other SO post

这是测试基于DataAnnotations验证是否在控制器工作的好方法:

[Test] 
public void UserController_CannotCreateUserWithNoLastName() 
{ 
    // Arrange 
    var user = new CreateUserViewModel(); 
    UsersController controller = new UsersController(); 
    var validationContext = new ValidationContext(user, null, null); 
    var validationResults = new System.Collections.Generic.List<ValidationResult>(); 
    Validator.TryValidateObject(user, validationContext, validationResults); 
    foreach (var validationResult in validationResults) 
    { 
    controller.ModelState.AddModelError("", validationResult.ErrorMessage); 
    } 

    // Act 
    var result = controller.CreateUser(user); 

    // Assert 
    Assert.IsFalse(controller.ModelState.IsValid); 
} 

任何改进建议将非常受欢迎。我也想知道是否通常为每个验证/业务规则写一个测试。谢谢!

回答

0

您列出的代码是基于所发现的代码here

就个人而言,我写在每个标注的基础,像这样的测试:

[Test] 
    public void CreateEventViewModel_Description_Property_Contains_StringLength_Attribute() 
    { 
     // Arrange 
     PropertyInfo propertyInfo = typeof(CreateEventViewModel) 
             .GetProperty("Description"); 
     // Act 
     StringLengthAttribute attribute = propertyInfo 
         .GetCustomAttributes(typeof(StringLengthAttribute), true) 
      .Cast<StringLengthAttribute>() 
      .FirstOrDefault(); 

     // Assert 
     Assert.NotNull(attribute); 
     Assert.AreEqual(255, attribute.MaximumLength); 
    } 

我基于这一关的一些信息,Brad Wilson发布一段时间了。这些测试存储在控制器测试中。我不确定今天是否有更有效的方法来做这件事(一些人创建了更通用的帮助器方法来完成这种类型的测试;我只是希望对每个属性进行明确的测试),但它会验证您的数据注释按预期存在于您的视图模型上。

这种类型的测试的组合,特别是验证属性,以测试一起测试模型状态在你前面的问题中列出

UsersController.ModelState.AddModelError("username", "Bad username"); 

是我通常去。

+0

谢谢。你写的是有道理的,是的,我的代码受到你在第一个问题中提到的链接的启发。你的测试非常细致。你认为我在做什么是错误的 - 将控制器方法看作是一个单元,我通过的视图模型违反了某些业务规则?你将不得不编写测试来检查你的控制器,但我不会。任何反馈欢迎... – cs0815

+0

我不一定看到它有什么问题。你上面的内容不是测试任何一个特定的状态或预期的错误(这是我想指出的一件事,看看测试方法的标题;你确定*这就是测试?它可能会做更多)。它正在看一切。就个人而言,我想要特定的测试来测试每个单独的注释或可能的错误状态,但是如果您对稍微更通用的测试例程感到满意,那也可以。 – Khepri