2011-06-22 3 views
0

Ce fait suite à ce sujet:méthode du contrôleur de test + DataAnnotations - asp.net mvc 3

other SO post

Est-ce une bonne façon de vérifier si la validation basée sur DataAnnotations fonctionne dans le contrôleur:

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

Toute suggestion d'amélioration serait la bienvenue. Je me demande aussi si on écrit habituellement un test pour chaque règle de validation/métier. Merci!

Répondre

0

Est-ce que le code que vous avez listé est basé sur ce qui est trouvé here?

Personnellement, j'écrire des tests comme si sur une base par annotation:

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

Je me suis basé au large de certaines informations que Brad Wilson posté il y a quelque temps. Ces tests sont stockés séparément des tests du contrôleur. Je ne suis pas sûr qu'il existe un moyen plus efficace de le faire aujourd'hui (certaines personnes ont créé des méthodes auxiliaires plus génériques pour faire ce type de test, je préfère simplement avoir des tests explicites pour chaque attribut par moi-même), mais cela vérifiera que Les annotations de données existent sur vos modèles de vue, comme prévu.

Une combinaison de ce type de test, en particulier la vérification des attributs, ainsi que des tests à l'état de modèle de test comme indiqué dans votre précédente question

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

est ce que je vais généralement avec.

+0

Merci. Ce que vous avez écrit est logique et oui mon code est inspiré par le lien que vous mentionnez dans votre première question. Votre test est très fin. Comptez-vous que ce que je fais est faux - voyez la méthode du contrôleur comme une unité où je passe dans des modèles qui violent certaines règles d'affaires? Vous auriez à écrire des tests pour vérifier votre contrôleur alors que je ne le ferais pas. Tous les commentaires bienvenus ... – cs0815

+0

Je ne vois pas nécessairement quelque chose de mal avec cela. Ce que vous avez ci-dessus ne teste pas un état spécifique ou une erreur attendue (c'est une chose que je voudrais souligner en regardant le titre de la méthode de test, êtes-vous sûr que c'est tout ce qui est en train de tester?). Il regarde tout. Personnellement, je veux des tests spécifiques pour tester chaque annotation individuelle ou état d'erreur possible, mais si vous êtes à l'aise avec une routine de test un peu plus générique, cela fonctionne également. – Khepri

Questions connexes