在asp.net mvc中测试控制器

时间:2010-05-19 13:57:58

标签: asp.net-mvc s#arp-architecture

我想测试提交的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组合。有人做过类似的事吗?任何指针都会非常感激。

感谢。

祝福,

基督教

1 个答案:

答案 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" );
}