我有一个视图模型类,它有一个方法,它使用DateTime.Now基于viewmodel上的日期与当前时间之间的时间段进行计算。
我希望能够对方法进行单元测试,因此我使用的是时间服务,可以在我的测试中存根。但是,需要以某种方式将依赖项注入viewmodel类。当视图模型回发到控制器时,如果在视图模型列表中添加条目,则将其传递给控制器方法的参数。我想在那时自动将日期服务传递给viewmodel。
有谁知道如何实现这一目标?我正在使用Mvc3和StructureMap。
答案 0 :(得分:3)
我不会在视图模型上进行此类计算。在视图模型上,我会坚持使用POCO属性。在将域模型映射到视图模型时,我会执行此计算。这可以在控制器操作中或您可以访问服务层的映射层中完成。
答案 1 :(得分:0)
您可以编写一个自定义DOB验证器,而不是在viewmodel中编写一个方法来验证DOB:
public static ValidationResult DOBValidator(DateTime DOB)
{
if (DOB!= null && DOB.Date != DateTime.MinValue.Date)
{
int age = DateTime.Now.Year - DOB.Year;
if (age < 18)
{
return new ValidationResult("Sorry, age should be more than 18 years");
}
}
return ValidationResult.Success;
}
}
然后你可以在viewmodel中装饰你的DOB属性,例如:
[CustomValidation(typeof(ViewModelClassName), "DOBValidator")]
在单元测试中,您可以调用viewmodel方法并传递一个虚拟日期时间值:
DateTime testDOB = DateTime.Now.AddYears(-18);
ValidationResult result = ViewModelObject.DOBValidator(testDOB);
Assert.AreEqual(ValidationResult.Success, result, "The ValidationResult was incorrect");
希望这有帮助。