【问题标题】:How can I mock the Response.StatusCode with Moq?如何使用 Moq 模拟 Response.StatusCode?
【发布时间】:2012-06-01 02:48:21
【问题描述】:

我有以下方法:

    public void SetHttpStatusCode(HttpStatusCode httpStatusCode)
    {
        Response.StatusCode = (int)httpStatusCode;
    }

还有以下测试:

    [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>());
    }

另外,这里是 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;
    }

当我运行测试时,我得到以下异常:

    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.

Moq 如何期望/要求调用被调用?我已经调试了 SetHTTPStatusCode 方法,响应对象确实是一个模拟对象,但是 Moq 坚持认为没有调用。我错过了什么吗?

谢谢!

【问题讨论】:

  • 也许你可以使用 HttpStatusCodeResult?

标签: c# asp.net-mvc unit-testing moq


【解决方案1】:

您还没有展示您的 TestHelpers.MakeHttpContext 方法的作用,因此有点难以理解发生了什么。

试试这样:

// 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);

【讨论】:

  • 达林,感谢您的回复。我已将 MakeHttpContext 方法添加到代码示例中。似乎我达到了重点,即 SetupGet for Response。但是,我仍然遇到同样的问题。
  • 是的。我也试过你的样品。我用你的样品代替了我的整个测试——起订量仍然是同样的例外。如果有影响,我正在使用 Moq 4.0
  • 这很奇怪。我对整个解决方案进行了 Clean Build,重新运行了您的代码示例,现在它工作正常。谢谢,达林!
  • @DarinDimitrov 我正在尝试做同样的事情,但在以下行出现错误 ControllerContext = new ControllerContext() { HttpContext = mockHttpContext.Object 它说不能隐式转换类型“System.Web.Mvc.ControllerContext”到“System.Web.Http.Controllers.HttpControlerContext”}
猜你喜欢
  • 2012-03-18
  • 2010-10-19
  • 2016-09-30
  • 2019-10-06
  • 1970-01-01
  • 2020-10-27
  • 2018-12-27
  • 2019-06-16
  • 2012-07-22
相关资源
最近更新 更多