測試專案中 new Controller() 時,HttpContext 為 null,導致 Session、Cookie、Form 等皆不可用。
public static class MvcMockHelpers
{
public static HttpContextBase FakeHttpContext(this MockRepository mocks)
{
var context = mocks.PartialMock<HttpContextBase>();
var request = mocks.PartialMock<HttpRequestBase>();
var response = mocks.PartialMock<HttpResponseBase>();
var session = mocks.PartialMock<HttpSessionStateBase>();
var server = mocks.PartialMock<HttpServerUtilityBase>();
SetupResult.For(context.Request).Return(request);
SetupResult.For(context.Response).Return(response);
SetupResult.For(context.Session).Return(session);
SetupResult.For(context.Server).Return(server);
mocks.Replay(context);
return context;
}
public static HttpContextBase FakeHttpContext(this MockRepository mocks, string url)
{
var context = FakeHttpContext(mocks);
context.Request.SetupRequestUrl(url);
return context;
}
public static void SetFakeControllerContext(this MockRepository mocks, Controller controller)
{
var httpContext = mocks.FakeHttpContext();
var controllerContext = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = controllerContext;
}
}
[TestMethod]
public void Test_Controller_Action()
{
var mocks = new MockRepository();
var controller = new HomeController();
mocks.SetFakeControllerContext(controller);
// 接著測試 Action...
}
此輔助類別完整模擬 HttpContextBase 及其子物件,讓 Controller 測試不再受限於 Web 環境。