How can I mock Response.StatusCode with Moq?

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 the 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 call calls? I was debugging the SetHTTPStatusCode method, the response object is indeed a bullied object, however Moq insists there was no call. Am I missing something?

Thanks!

+6
source share
1 answer

You have not shown what your TestHelpers.MakeHttpContext method TestHelpers.MakeHttpContext , so it’s a little difficult to understand what is going on.

Try it 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); 
+18
source

Source: https://habr.com/ru/post/916672/


All Articles