2010-02-16 2 views
1

У меня проблемы с [ObjectValidator]. Итак, у меня есть:Тестирование объекта 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; 
    } 

и другой класс:

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

Теперь вы можете сказать мне, почему следующий тест проходит?

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

Это не должно быть действительным, так как: атрибут пользователя (типа UserBO) содержит имя пользователя «ASD» (3 символа), и я определен для него StringLengthValidator (от 5 до 25 символов) .. так почему тест проходит? этот объект недействителен Не могу понять.

Спасибо.

+0

Хотя это действительно не актуально для вашего фактического вопроса, как валидаторы регулярных выражений, так и строки будут захлебываться нулем. Это означает, что ненулевой валидатор является избыточным. –

+1

И снова, в то время как это не связано с вашим вопросом, регулярное выражение «[a-z] | [A-Z] | [0-9] *», вероятно, не делает то, что вы думаете, что оно делает. Буквально каждая строка будет проходить проверку. Я подозреваю, что «^ [a-zA-Z0-9] {5,25} $«, вероятно, ближе к тому, что вы хотите. Предполагая, что вы хотите, чтобы имена пользователей имели только буквы и цифры. Это также имеет преимущество, заключающееся в проверке длины строки, и вы попадаете только на один валидатор. –

ответ

1

Вы должны указать набор правил в ObjectValidator, если вы хотите, чтобы правила из набора, отличного от применяемого по умолчанию набора.

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

Вышеупомянутый должен работать в этом конкретном случае. Кроме того, вы можете удалить параметр набора правил из проверки длины строки, чтобы оставить его в заданном по умолчанию.

Смежные вопросы