2010-05-19 100 views
0

我想测试提交的DTO的验证。这是在控制器的裸骨创建动作:在asp.net中测试控制器mvc

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

的力学,虽然不相关的,如下:我已强类型视图=形式提交DTO到这个动作,其或者返回的形式或创建的对象的详细信息页面。

我想单元测试模型是否包含给定一些无效dto的某些key/errorMessage组合。有人做过类似的事情吗?任何指针将非常感激。

谢谢。

最良好的祝愿,

基督教

回答

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"); 
} 
+0

这看起来非常感谢。我明天会尝试。谢谢。 – cs0815 2010-05-19 14:19:15

+0

@csetzkom - 可能有一些语法问题(我在我的Mac上),但这是基本的想法。 – tvanfosson 2010-05-19 14:22:48

+0

是啊谢谢,但我得到的想法 - 我认为 - 将很快找到,然后接受你的回答 – cs0815 2010-05-19 14:31:47