如何在 ASP.NET Core 1.1 中对使用 HttpContext 的 MVC 控制器进行单元测试

How to unit test MVC controller that uses HttpContext in ASP.NET Core 1.1

我在 .Net Core 1.1 框架的 ASP.Net Core 中编写了这个小方法:

public class AccountController : Controller
{
    public IActionResult Logout()
    {
        HttpContext.Authentication.SignOutAsync("SchemaName");
        HttpContext.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

        return RedirectToAction("Index", "Home");
    }
}

我在如何编写单元测试来验证此方法 returns 是 RedirectToActionResult 方面苦苦挣扎,并根据在这里和那里找到的旧信息和相关新信息尝试了许多不同的方法.问题是 HttpContextnull 而我一直没有成功地模拟它。

如果您能帮助编写此测试,我们将不胜感激!

您可以使用 DefaultHttpContext 的实例设置控制器,就像在这个辅助函数中一样。

    public MyController CreateController()
    {            
        var actionContext = new ActionContext
        {
            HttpContext = new DefaultHttpContext(),
            RouteData = new RouteData(),
            ActionDescriptor = new ControllerActionDescriptor()
        };

        var controller = new MyController
        {
            ControllerContext = new ControllerContext(actionContext)
        };

        return controller;
    }

然后 MyController 实例的 HttpContext 属性 不再是 null 并且它在 HttpContext.Authentication 属性 中提供了一个默认的 AuthenticationManager ].