2011-06-22 35 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