How can I mock the Response.StatusCode with Moq?
asp.net-mvc, c#, moq, unit-testing
Solution
You haven't shown what your `TestHelpers.MakeHttpContext` method does so it's a bit difficult to understand what's going on.
Try like this:
// Arrange
var mockHttpContext = new Mock<HttpContextBase>();
var response = new Mock<HttpResponseBase>();
mockHttpContext.SetupGet(x => x.Response).Returns(response.Object);
//creates an instance of an asp.net mvc controller
var controller = new AppController()
{
ControllerContext = new ControllerContext()
{
HttpContext = mockHttpContext.Object
}
};
// Act
controller.SetHttpStatusCode(HttpStatusCode.OK);
//Assert
response.VerifySet(x => x.StatusCode = (int)HttpStatusCode.OK);
Problem
I have the following method: ``` public void SetHttpStatusCode(HttpStatusCode httpStatusCode) { Response.StatusCode = (int)httpStatusCode; } ``` And the following test: ``` [TestMethod] public void SetHttpStatusCode_SetsCorrectStatusCode() { //Arrange //Any url will suffice var mockHttpContext = TestHelpers.MakeHttpContext(""); mockHttpContext.SetupSet(x => x.Response.StatusCode = It.IsAny<int>()); //creates an instance of an asp.net mvc controller var controller = new AppController() { ControllerContext = new ControllerContext() { HttpContext = mockHttpContext.Object } }; // Act controller.SetHttpStatusCode(HttpStatusCode.OK); //Assert mockHttpContext.VerifySet(x => x.Response.StatusCode = It.IsAny<int>()); } ``` Also, Here is MakeHttpContext ``` public static Mock<HttpContextBase> MakeHttpContext(string url) { var mockHttpContext = new Mock<HttpContextBase>(); var mockRequest = new Mock<HttpRequestBase>(); var mockResponse = new Mock<HttpResponseBase>(); var mockSession = new Mock<HttpSessionStateBase>(); //request mockRequest.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(url); mockHttpContext.Setup(x => x.Request).Returns(mockRequest.Object); //response mockResponse.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(x => x); mockHttpContext.Setup(x => x.Response).Returns(mockResponse.Object); //session mockHttpContext.Setup(x => x.Session).Returns(mockSession.Object); return mockHttpContext; } ``` When I run the test, I get the following exception: ``` Test method PA.Tests.Controllers.AppControllerTest.SetHttpStatusCode_SetsCorrectStatusCode threw exception: Moq.MockException: Expected invocation on the mock at least once, but was never performed: x => x.StatusCode = It.IsAny<Int32>() Configured setups: x => x.StatusCode = It.IsAny<Int32>(), Times.Never No invocations performed. ``` How does Moq expect/require invocations to be called? I've debugged the SetHTTPStatusCode method, the response object is indeed a mocked object, however Moq insists that there was no invocation. Am I missing something? Thanks!