受到攻击的阻碍阻碍了试图对返回操作结果的方法进行单元测试



好的-所以我一开始是这样的,

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的同时如何重定向。我一直在浏览这个网站,我发现了这个问题。我如何在ViewResult或ActionResult函数中重定向?但这并没有真正的帮助。

如果有人能告诉我在这里该怎么做,那将是规则——我被难住了。

我会从您的操作中删除该逻辑,转而使用AuthorizeAttribute。然后你的测试不会改变,你可以创建一个单独的测试,断言动作是由属性修饰的。

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

您的测试将不得不添加另一个步骤:断言返回的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>));
}

最新更新