Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.net单元测试模型数据批注DataType.EmailAddress?_C#_Asp.net_Asp.net Mvc_Unit Testing_Data Annotations - Fatal编程技术网

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;
    }
}