用ASP.NET MVC 3+数据注释和属性DateTime



我正在进行一个使用DataAnnotations和ASP的项目。NET MVC3。我们使用此解决方案来测试"日期公告"的验证:http://gcbyjm.blogspot.com.br/2011/02/how-to-unit-test-dataannotations.html

我在测试"ViewModel"的属性"DateTime"时遇到问题。

public class AchievementVM
{
    ...
    [Required(ErrorMessage = "The date field is required.")]
    [DataType(DataType.DateTime, ErrorMessage = "Invalid date.")]
    public DateTime Date { get; set; }
    ...
}
    [TestMethod]
    public void AchievementVMValidator_ShouldHaveErrorWhenDateIsInvalid()
    {
        // Arrange
        var achievementVM = new AchievementVM() { Date = ???? };
        // Act
        var errors = ValidationBuddy.GetErrors(achievementVM) as List<ErrorInfo>;
        // Assert
        ErrorInfo error = errors.Find(delegate(ErrorInfo e) { return e.ErrorMessage == "The date field is required."; });
        Assert.IsTrue(error != null);
    }

我的问题是如何传递此属性的值来模拟ModelBind ERROR。在这两种情况下,文本框都是空数据和无效数据。

非常感谢!

如果我正确理解您的问题,我认为您应该测试由字段所在的视图调用的操作方法。类似地,您可以将无效或空值传递给复制空值或无效值的操作方法。

请记住,视图模型应该是视图的表示。因此,如果您的视图允许不输入DateTime(空文本框),那么我认为您的视图模型应该有一个可以为null的DateTime。

public DateTime? MyProperty { get; set; }

这样,在单元测试中,您可以测试一个null DateTime。

在您的域模型上,这应该是不同的,因为您不希望数据库接收null DateTime,因此域模型属性不应该为null。查看模型验证应该停止将空日期传递给域模型,或者将其转换为域模型可以处理的DateTime。例如,空的DateTime可能会转换为DateTime。现在,如果您的业务需求与此相匹配。

我希望这能有所帮助。

最新更新