Here is an example of the unit test class using MsTest and Moq that mocks the HttpRequest and HttpResponse objects. (.NET 4.0, ASP.NET MVC 3.0)
The controller action receives the value from the request and sets the HTTP header in the response objects. Other http context objects can be mixed in the same way.
[TestClass] public class MyControllerTest { protected Mock<HttpContextBase> HttpContextBaseMock; protected Mock<HttpRequestBase> HttpRequestMock; protected Mock<HttpResponseBase> HttpResponseMock; [TestInitialize] public void TestInitialize() { HttpContextBaseMock = new Mock<HttpContextBase>(); HttpRequestMock = new Mock<HttpRequestBase>(); HttpResponseMock = new Mock<HttpResponseBase>(); HttpContextBaseMock.SetupGet(x => x.Request).Returns(HttpRequestMock.Object); HttpContextBaseMock.SetupGet(x => x.Response).Returns(HttpResponseMock.Object); } protected MyController SetupController() { var routes = new RouteCollection(); var controller = new MyController(); controller.ControllerContext = new ControllerContext(HttpContextBaseMock.Object, new RouteData(), controller); controller.Url = new UrlHelper(new RequestContext(HttpContextBaseMock.Object, new RouteData()), routes); return controller; } [TestMethod] public void IndexTest() { HttpRequestMock.Setup(x => x["x"]).Returns("1"); HttpResponseMock.Setup(x => x.AddHeader("name", "value")); var controller = SetupController(); var result = controller.Index(); Assert.AreEqual("1", result.Content); HttpRequestMock.VerifyAll(); HttpResponseMock.VerifyAll(); } } public class MyController : Controller { public ContentResult Index() { var x = Request["x"]; Response.AddHeader("name", "value"); return Content(x); } }
Maksym Kozlenko Feb 22 '13 at 4:37
source share