2009-10-05 38 views
0

我要测试的“项目”对象中的数据之前将其重定向到另一个动作。MVC MOQ单元测试RedirecToAction前的对象()

 public ActionResult WebPageEdit(WebPage item, FormCollection form) 
    { 
     if (ModelState.IsValid) 
     { 

      item.Description = Utils.CrossSiteScriptingAttackCheck(item.Description); 
      item.Content = Utils.CrossSiteScriptingAttackCheck(item.Content); 
      item.Title = item.Title.Trim(); 
      item.DateUpdated = DateTime.Now; 

      // Other logic stuff here 

      webPagesRepository.Save(item); 


      return RedirectToAction("WebPageList"); 
     } 

这里是我的测试方法:

[Test] 
    public void Admin_WebPageEdit_Save() 
    { 

     var controller = new AdminController(); 

     controller.webPagesRepository = DataMock.WebPageDataInit(); 
     controller.categoriesRepository = DataMock.WebPageCategoryDataInit(); 

     FormCollection form = DataMock.CreateWebPageFormCollection(); 


     RedirectToRouteResult actionResult = (RedirectToRouteResult)controller.WebPageEdit(webPagesRepository.Get(1), form); 
     Assert.IsNotNull(actionResult); 

     Assert.AreEqual("WebPageList", actionResult.RouteValues["action"]); 


     var item = ((ViewResult)controller.WebPageEdit(webPagesRepository.Get(1), form)).ViewData.Model as WebPage; 

     Assert.NotNull(item); 



     Assert.AreEqual(2, item.CategoryID); 




    } 

它没有在这一行:

var item = ((ViewResult)controller.WebPageEdit(webPagesRepository.Get(1), form)).ViewData.Model as WebPage; 

我在想有没有在它之前测试“项目”对象的任何方式重定向到其他操作?

+1

请编辑您的问题,包括:1:代码可以编译可能(不是WebPageEdit的所有代码路径返回一个值)。 2:你收到的错误的描述。 –

回答

0

它失败了,你可能知道的原因,那是你的控制器操作不会返回的ViewResult,只有RedirectToRouteResult(假设你没有ellided一些代码路径)。您可能会在要重定向的操作中返回ViewResult,但您并未在此处测试该操作。

确定和测试项目对象的重定向之前的状态,最好的办法是与你的webPagesRepository对象的Save()方法的交互。据推测,从测试方法的名称,你想测试,这个方法实际上被称为无论如何。因此,您应该对Save()方法有所期待。在此期望内,您可以检查并确定传递给它的项目对象的状态。这假定你的webPagesRepository是一个模拟的依赖。

我是犀牛嘲笑用户,因此只有知道如何使用API​​设置的期望。让我知道你是否会发现它有用,然后我会发布它。