C# Asp.net单元测试模型数据批注DataType.EmailAddress?
如何测试C# Asp.net单元测试模型数据批注DataType.EmailAddress?,c#,asp.net,asp.net-mvc,unit-testing,data-annotations,C#,Asp.net,Asp.net Mvc,Unit Testing,Data Annotations,如何测试数据类型.EmailAddress 我有一个客户模型,带有电子邮件属性,需要验证以下数据注释: [StringLength(100)] [DataType(DataType.EmailAddress, ErrorMessage = "Email must be a valid email address")] [Display(Name = "Email")] [Required(ErrorMessage = "Email is required")] public string ema
数据类型.EmailAddress
我有一个客户
模型,带有电子邮件
属性,需要验证以下数据注释:
[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; }
我正在编写单元测试来测试验证。我已经知道了如何测试所需的长度和字符串长度
下面是我的方法,它捕获其他错误,但不处理数据类型验证:
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;
}
如何测试DataType.EmailAddress
-传入无效值并接收错误结果?使用DataTypeAttribute
派生自DataTypeAttribute
并重写IsValid
方法,该方法用于检查该值是否为有效电子邮件
使用
[DataType(DataType.EmailAddress, ErrorMessage = "Email must be a valid email address")]
不执行任何电子邮件验证操作
如果检查源代码,您会发现它主要是一个基本属性,用于创建自定义和目标验证属性
原始问题中的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;
}
}
[TestClass]
公共类UnitTester示例{
[测试方法]
public void无效\u电子邮件\u地址\u抛出\u错误(){
//安排
var badEmail=“1234_41;”(”;
var subject=新客户{email=badmail};
//表演
var结果=ValidateModel(主体);
//断言
Assert.IsTrue(results.Count>0);
Assert.IsTrue(results.Any(v=>v.MemberNames.Contains(“email”));
}
公共类客户{
[长度(100)]
[显示(Name=“电子邮件”)]
[必需(ErrorMessage=“需要电子邮件”)]
[电子邮件地址(ErrorMessage=“电子邮件必须是有效的电子邮件地址”)]
公共字符串电子邮件{get;set;}
}
私有列表验证模型(T模型){
var context=新的ValidationContext(model,null,null);
var result=新列表();
var valid=Validator.TryValidateObject(模型、上下文、结果、true);
返回结果;
}
}
Hi Hackerman,我看不出这对我有什么帮助。我想测试DataType.EmailAddress传入的无效值,并在结果中捕获预期的错误消息。感谢没有与[DataType]
属性关联的验证。它用于添加描述如何呈现html的元数据(使用编辑器for(m=>m.email)将添加
type=“email”)谢谢,Nkosi。这是一个非常好的解决方案,当你可以修改模型时。我可能可以修改它,但它属于另一个团队,需要付出一些努力。我希望看到一个解决方案,可以测试DataType.EmailAddress抛出的错误。在我构建这些单元测试的过程中,我非常确定我对于其他数据类型也会有类似的问题。尽管如此,我还是很欣赏这种解决方案。Thanks@deanblank没有其他解决方案。DataTypeAttribute使用不正确。其他团队需要更改它。再次感谢。感谢您抽出时间。
[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;
}
}