【问题标题】:Custom Data-annotation not firing in unit-test自定义数据注释未在单元测试中触发
【发布时间】:2013-03-06 19:28:50
【问题描述】:

我目前正在试验验证属性, 现在我正在尝试验证我的 ViewModel,它包含一个带有自定义验证属性的 EmailAddress。

public class UserLoginModel
{
    [Required]
    [EmailAddress]
    public string email { get; set; }

    [Required]
    public string password { get; set; }

    public bool rememberMe { get; set; }
}

我做了一个单元测试,我提供了一个虚假的电子邮件地址并尝试验证我的视图模型。

[TestMethod]
public void TestingInvalidEmailAddress()
{
    UserLoginModel model = new UserLoginModel();
    model = GetAValidLoginModel(); //Get a default-model where all parameters are correct
    model.email = "thisisnotavalidemail.com";

    ValidationContext context = new ValidationContext(model, null, null);
    var results = new List<ValidationResult>();
    bool validModel= Validator.TryValidateObject(model, context, results);
    //This is always true

    Assert.IsFalse(validModel);
}

这个测试的结果总是假的。

所以我检查了我的属性,因为我认为我可能犯了一个错误:

[TestMethod]
public void Email()
{
    string email;
    var attr = new EmailAddressAttribute();

    email = "myemail@domain.com";            
    Assert.IsTrue(attr.IsValid(email));

    email = "thisisnotavalidemail.com";
    Assert.IsFalse(attr.IsValid(email)); //If this fails, the test is successfull
}

这确实通过了测试,使用完全相同的电子邮件地址。

当我在浏览器中测试它时,它也会正确验证。

那么为什么在第一个测试方法中它没有告诉我我的电子邮件地址无效?

【问题讨论】:

  • 嗯,您提到了“自定义”验证属性。你是说 [EmailAddress] 属性不是 .NET 属性吗?
  • 不,我使用的是 .NET4.0,EmailAddress 仅在 .NET4.5 中是标准的。
  • mkay,因为我用 .net 属性尝试了同样的事情。 确切同样的问题。奇怪的是,[Required] 属性确实按预期工作。
  • 我又试了一次,我发现了这个帖子:link 并且有效。我不敢相信我之前没有发现这个。我只是错过了一个额外的参数
  • 啊哈哈 :) 好东西。已经投票了不能做更多:)

标签: unit-testing validation data-annotations


【解决方案1】:

我在over here 中找到了我的解决方案。 显然我只是缺少一个额外的参数。

bool validModel= Validator.TryValidateObject(model, context, results, **true**);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多