受到攻击的阻碍,试图对一个返回动作结果的方法进行单元测试

时间:2012-07-12 03:43:47

标签: asp.net-mvc unit-testing

好的 - 所以我就这样开始了,

public ViewResult Index()
{
   return View(service.GetProjects());
}

这是我的考验。

[TestMethod]
public void Index_Will_Return_A_List_Of_Active_Projects()
{
   var view = controller.Index();
   Assert.AreEqual(view.ViewData.Model.GetType(), typeof(List<Project>));
}

所有这一切都与dokken一起摇滚,但后来我添加了登录,如果用户未经过身份验证,我会将其重定向到登录页面。这是新方法的样子。

   public ActionResult Index()
   {
      if (Request.IsAuthenticated)
          return View(service.GetProjects());
      return RedirectToAction("Login", "Account");
   }

我的问题是这个 - 我无法弄清楚如何为我的生活修复单元测试。我不能再返回一个ViewResult,所以我无法检查.ViewData.Model属性,但我无法弄清楚如何在仍然返回viewresult时重定向。我一直在拖网站,我找到了这个How do I redirect within a ViewResult or ActionResult function?,但这并没有真正帮助。

如果有人可以告诉我这里会有什么规则 - 我很难过。

2 个答案:

答案 0 :(得分:1)

您的测试必须添加另一个步骤:声明返回的内容ViewResult。如果断言成功,则抛出它,然后继续使用另一个断言。

[TestMethod]
public void Index_Will_Return_A_List_Of_Active_Projects()
{
   var result = controller.Index();
   // this is called a guard assertion
   Assert.IsInstanceOfType(result, typeof(ViewResult)); 

   var view = (ViewResult)result;
   Assert.AreEqual(view.ViewData.Model.GetType(), typeof(List<Project>));
}

答案 1 :(得分:1)

我会从您的操作中移除该逻辑并使用{​​{3}}代替。然后你的测试不会改变,你可以创建一个单独的测试,断言动作正在被属性修饰。

[Authorize]
public ViewResult Index() 
{ 
    return View(service.GetProjects()); 
}