1. 程式人生 > 其它 >Mock HttpRequest in ASP.NET C# Controller

Mock HttpRequest in ASP.NET C# Controller

當我們需要對如下的Index 方法寫單元測試的時候,我們需要mock HttpRequest物件。

publicclassDefaultController : Controller
{
private IPlayer _player; public DefaultController (IPlayer player = null):base() { _player= player; } public PartialViewResult Index() { var viewModel = new PlayerViewModel();
var token = Request.Headers["token"]; if (token == null) { viewModel.ErrorMessage = "Please log in first." } else { viewModel.Player = _player.GetLoggedInPlayer(token);
}

return PartialView("Index", viewModel); }
}

通過如下方法,我們可以mock出ControllerContext。

public static ControllerContext GetControllerContext(ControllerBase controller)
{
  var httpRequest = new HttpRequest("", "http://test.com", "");
  var stringWriter = new StringWriter();
  var httpResponse = new HttpResponse(stringWriter);
  var httpContextMock = new HttpContext(httpRequest, httpResponse); // mock HttpContext
  httpContextMock.Request.Headers["token"] = "fake_token_here";
  return new ControllerContext(new HttpContextWrapper(httpContextMock), new RouteData(), controller);
}

並且在寫單元測試的時候,通過如下方式把mock的ControllerContext賦值給DefaultController。

_defaultController.ControllerContext = ControllerContextMocks.GetControllerContext(_defaultController);