Asp.net 单元测试模型数据注解DataType.EmailAddress?

dea*_*ean 5 c# asp.net asp.net-mvc unit-testing data-annotations

我如何测试DataType.EmailAddress

我有一个Customer带有Email以下数据注释的属性的模型来验证:

[StringLength(100)]
[DataType(DataType.EmailAddress, ErrorMessage = "Email must be a valid email address")]
[Display(Name = "Email")]
[Required(ErrorMessage = "Email is required")]
public string email { get; set; }
Run Code Online (Sandbox Code Playgroud)

我正在编写单元测试来测试验证。我已经弄清楚如何测试所需的字符串长度。

这是我捕获其他错误但不处理数据类型验证的方法:

private List<ValidationResult> ValidateModel<T>(T model)
{
    var context = new ValidationContext(model, null, null);
    var result = new List<ValidationResult>();
    var valid = Validator.TryValidateObject(model, context, result, true);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

我在测试方法中调用它:

[TestMethod]
public void Invalid_email_addresses_throw_errors()
{
    var model = new Models.Customer();

    model.email = "";
    var results = ValidateModel(model);
    Assert.IsTrue(results.Any(v => v.ErrorMessage == "Email is required"));
}
Run Code Online (Sandbox Code Playgroud)

如何测试DataType.EmailAddress- 传入无效值并因此收到错误?

Nko*_*osi 5

使用数据[EmailAddress]类型属性。

EmailAddressAttribute派生自DataTypeAttribute并覆盖该IsValid方法,该方法用于检查该值实际上是一个有效的电子邮件。

使用

[DataType(DataType.EmailAddress, ErrorMessage = "Email must be a valid email address")]
Run Code Online (Sandbox Code Playgroud)

不为电子邮件验证做任何事情。

如果您检查DataTypeAttribute的源代码,您会发现它主要是用于创建自定义和目标验证属性的基本属性。

DataTypeAttribute在原来的问题是使用不当。除了EmailAddressAttribute在以下单元测试中使用如下所示之外,没有其他解决方案。

[TestClass]
public class UnitTestExample {
    [TestMethod]
    public void Invalid_email_addresses_throw_errors() {
        //Arrange
        var badEmail = "1234_)(";
        var subject = new Customer { email = badEmail };

        //Act
        var results = ValidateModel(subject);

        //Assert
        Assert.IsTrue(results.Count > 0);
        Assert.IsTrue(results.Any(v => v.MemberNames.Contains("email")));
    }

    public class Customer {

        [StringLength(100)]            
        [Display(Name = "Email")]
        [Required(ErrorMessage = "Email is required")]
        [EmailAddress(ErrorMessage = "Email must be a valid email address")]
        public string email { get; set; }

    }

    private List<ValidationResult> ValidateModel<T>(T model) {
        var context = new ValidationContext(model, null, null);
        var result = new List<ValidationResult>();
        var valid = Validator.TryValidateObject(model, context, result, true);

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)