我想测试提交的DTO的验证。这是控制器创建操作的基础:
[AcceptVerbs(HttpVerbs.Post)]
public RedirectToRouteResult Create(SomeDTO SomeDTO)
{
SomeObject SomeObject = null;
try
{
SomeObject = this.RepositoryService.getSomeObjectRepository().Create(SomeDTO, this.RepositoryService);
}
catch (BrokenRulesException ex)
{
ex.AddModelStateErrors(ModelState, "Model");
}
catch (Exception e)
{
ModelState.AddModelError("Exception", e.Message);
}
TempData["ViewData"] = ViewData;
TempData["SomeDTO "] = SomeDTO;
return ModelState.IsValid ? RedirectToAction("SomeObjectDetail", new { Id = SomeObject.Id }) : RedirectToAction("Form");
}
机制虽然不相关,但如下所示:我有一个强类型的view = form,它向这个动作提交一个dto,它返回创建对象的表单或详细信息页面。
我想单元测试Model是否包含某些无效dto的某些key / errorMessage组合。有人做过类似的事吗?任何指针都会非常感激。
感谢。
祝福,
基督教
答案 0 :(得分:1)
在您的情况下,我认为您不想测试模型状态。相反,您应该简单地使用测试设置来引发正确/不正确的模型状态,然后测试在条件下返回适当的结果。您可以使用单独的测试来验证模型有效/无效的各种条件,但是,如果您使用DataAnnotations,我在测试中看不到它们和模型绑定基础结构正常工作。据推测,微软已经做到了这一点。
原创,基于(错误)假设返回ViewResult
我认为它应该是这样的。
[TestMethod]
public void TestCreate()
{
// set up
var result = Create( invalidDTO ) as ViewResult;
var modelState = result.ViewData.ModelState;
Assert.IsFalse( modelState.IsValid );
var errors = modelState.Errors;
Assert.AreEqual( 1, errors.Count );
Assert.AreEqual( errors[0].ErrorMessage, "some error message" );
}