如何测试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; }
我正在编写单元测试来测试验证。我已经弄清楚如何测试必需和字符串长度。
这是我的方法,可以捕获其他错误,但不会处理DataType验证:
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;
}
我用测试方法称呼它:
[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"));
}
如何测试DataType.EmailAddress
- 传入无效值并因此收到错误?
答案 0 :(得分:3)
使用[EmailAddress]
DataTypeAttribute。
EmailAddressAttribute派生自DataTypeAttribute
并覆盖IsValid
方法,该方法检查该值实际上是有效的电子邮件。
使用
[DataType(DataType.EmailAddress, ErrorMessage = "Email must be a valid email address")]
对电子邮件验证没有任何作用。
如果您检查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;
}
}