2010-02-16 6 views
1

Je rencontre des problèmes avec [ObjectValidator]. Donc, j'ai:Test de l'unité ObjectValidator

public class UserBO 
{ 
    public int ID 
    { 
     get; 
     set; 
    } 

    [NotNullValidator(MessageTemplate = "Can't be null!")] 
    [RegexValidator(@"[a-z]|[A-Z]|[0-9]*", MessageTemplate = "Must be valid!", Ruleset = "validate_username")] 
    [StringLengthValidator(5, RangeBoundaryType.Inclusive, 25, RangeBoundaryType.Inclusive, Ruleset = "validate_username")] 
    public string username 
    { 
     get; 
     set; 
    } 

et une autre classe:

public class PersonBO 
{ 
    public int ID 
    { 
     get; 
     set; 
    } 

    [NotNullValidator(MessageTemplate="Can't be null!")] 
    [ObjectValidator(MessageTemplate = "Must be valid!", Ruleset="validate_obj_user")] 
    public UserBO User 
    { 
     get; 
     set; 
    } 
... 

Maintenant, pouvez-vous me dire pourquoi le test suivant passe?

[TestMethod()] 
public void PersonBOConstructorTest() 
    { 
     PersonBO target = new PersonBO() 
      { 
       User = new UserBO 
       { 
        ID = 4, 
        username = "asd" 
       } 
      }; 
     ValidationResults vr = Validation.Validate<PersonBO>(target, "validate_obj_user"); 
     Assert.IsTrue(vr.IsValid); 
    } 

Cela ne devrait pas être valide, parce que: attribut utilisateur (de type UserBO) contient nom d'utilisateur "asd" (3 caractères) et i défini pour un StringLengthValidator (entre 5 et 25 caractères) .. alors pourquoi le test passe? cet objet n'est pas valide Je ne peux pas comprendre.

Merci.

+0

Bien que ce ne soit pas vraiment lié à votre question, les validateurs d'expressions rationnelles et de longueur de chaîne s'étoufferont sur une valeur nulle. Cela signifie que le validateur non nul est redondant. –

+1

Et encore, même si ce n'est pas pertinent pour votre question, l'expression rationnelle "[a-z] | [A-Z] | [0-9] *" ne fait probablement pas ce que vous pensez qu'elle est en train de faire. Littéralement, toutes les chaînes possibles passeront le test. Je soupçonne que "^ [a-zA-Z0-9] {5,25} $" est probablement plus proche de ce que vous voulez. En supposant que ce que vous voulez est de vous assurer que les noms d'utilisateur n'ont rien d'autre que des lettres et des chiffres. Cela a aussi l'avantage de couvrir la vérification de la longueur de la chaîne, ce qui vous ramène à un seul validateur. –

Répondre

1

Vous devez spécifier un jeu de règles dans votre ObjectValidator si vous souhaitez que les règles d'un jeu autre que celui défini par défaut soient appliquées.

[ObjectValidator("validate_username", MessageTemplate = "Must be valid!", Ruleset = "validate_obj_user")] 

Ce qui précède devrait fonctionner dans ce cas particulier. Vous pouvez également supprimer le paramètre ruleset du validateur de longueur de chaîne pour le laisser dans l'ensemble par défaut.