Mock HttpRequest in ASP.NET C# Controller
阿新 • • 發佈:2021-06-16
當我們需要對如下的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);