0

我正在使用 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。在这两种情况下,文本框都是空的和无效的数据。

非常感谢!

4

2 回答 2

0

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

public DateTime? MyProperty { get; set; }

这样,在您的单元测试中,您可以测试空 DateTime。

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

我希望这有帮助。

于 2013-01-15T01:36:13.090 回答
0

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

于 2012-08-03T14:29:04.870 回答