我正在进行一个使用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。现在,如果您的业务需求与此相匹配。
我希望这能有所帮助。