2010-02-16 15 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个字符),以及i为它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")] 

上面应该在这个特定情况下工作。或者,您可以从字符串长度验证程序中删除规则集参数,以将其保留在默认集中。