2016-11-18 44 views
3

我有這個小方法寫在ASP.Net核心.Net的核心框架1.1:如何進行單元測試MVC控制器,它使用的HttpContext在ASP.NET 1.1的核心

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

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

我掙扎了很多與如何編寫一個單元測試,驗證此方法返回RedirectToActionResult,並根據這裏和那裏發現的舊信息和相關新信息嘗試了許多不同的方法。問題是,HttpContextnull,我一直在嘲笑它不成功。

任何幫助寫這個測試將不勝感激!

回答

3

您可以使用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

0

對於這種情況,您可以使用第三方框架,如MyTested.AspNetCore.Mvc。它準備所有必要的服務(包括HttpContext的)爲您提供:

MyController<AccountController> 
    .Instance() 
    .Calling(c => c.Logout()) 
    .ShouldReturn() 
    .Redirect() 
    .To<HomeController>(c => c.Index()); 

此外,如果需要定製,你可以輕鬆地添加它:

MyController<AccountController> 
    .Instance() 
    .WithHttpContext(httpContext => 
    { 
     httpContext.Authentication = myAuthnenticationMock; 
    }) 
    .Calling(c => c.Logout()) 
    .ShouldReturn() 
    .Redirect() 
    .To<HomeController>(c => c.Index()); 
相關問題