单元测试的模型验证仅适用于字符串

时间:2014-09-10 14:18:55

标签: c# validation unit-testing

我有一个这样的课程

型号:

public class Circle
{
    [Required(ErrorMessage = "Diameter is required")]
    public int Diameter { get; set; }

    [Required(ErrorMessage = "Name is required")]
    public string Color { get; set; }
}

测试:

[TestMethod]
public void TestCircle()
{
    Circle circle = new Circle();
    circle.Diameter = 5;
    circle.Color = "Black";
    ValidationContext contex = new ValidationContext(circle, null, null);
    Validator.ValidateObject(circle , contex);
}

我预计,只要Diameter或Color为空,它就会失败。但是,当字符串参数Color为null时,上述测试仅失败。为什么?我该怎么办才能验证Diameter?

2 个答案:

答案 0 :(得分:2)

您不应将Required属性与数字属性一起使用。请改用Range属性:

  

RequiredAttribute属性指定表单上的字段   验证后,该字段必须包含值。验证异常   如果属性为null,则包含空字符串(“”)或   仅包含空格字符。

答案 1 :(得分:2)

RequiredAttribute仅对null(和空字符串)进行验证,但int是不可为空的,默认情况下变为0。

您可以将其设为可空(使用int?),或者您可以使用其他类型的属性。正如DmitryG所说,你可以使用RangeAttribute,如果你有一定数量的数字可以接受,但如果没有,我认为唯一的方法就是一个CustomValidationAttribute,它有一个将值比较为零的函数。

编辑:鉴于它是一个直径,我想你需要确保它是正面的,而不仅仅是不等于零。在这种情况下,RangeAttribute确实可能是最好的,最小值为1,最大值为Int32.MaxValue