【问题标题】:MockingHttpRequestMessage/HttpContextWrapper模拟HttpRequestMessage/HttpContextWrapper
【发布时间】:2016-01-04 22:06:51
【问题描述】:

我正在尝试使用 Moq 对以下方法进行单元测试,但我遇到了在这些类上操作某些属性的可访问性问题,甚至为此模拟它们。

    public string GetClientIpAddress(HttpRequestMessage request)
    {
        if (request.Properties.ContainsKey("MS_HttpContext"))
            return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;

        if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
            return ((RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]).Address;

        return "IP Address Unavailable";
    }

为了进行测试,我创建了一个 HttpRequestMessage 实例,并将其作为参数传入。然后我添加一个 HttpRequest 和 HttpContext 的模拟,就像这样......

        // Assign 
        var mockHttpRequestBase = new Mock<HttpRequest>();
        mockHttpRequestBase.Setup(m => m.UserHostAddress).Returns("127.0.0.1");

        var mockHttpContext = new Mock<HttpContext>();
        mockHttpContext.Setup(m => m.Request).Returns(mockHttpRequestBase.Object);

        var httpRequestMessage = new HttpRequestMessage();
        httpRequestMessage.Properties.Add(new KeyValuePair<string, object>("MS_HttpContext", mockHttpRequestBase.Object));

        var apiCachedController = new ApiCachedController();

        // Act
        var address = apiCachedController.GetClientIpAddress(httpRequestMessage);

        // Assert
        Assert.AreEqual(address, "127.0.0.1");

编辑:抱歉,我没有更清楚地了解我遇到的具体问题。 HttpRequest 无法被模拟。我得到一个 NotSupportedException ,“要模拟的类型必须是接口或抽象或非密封类”。我试过分别使用 HttpRequestBase 和 HttpContextWrapper 代替 HttpRequest 和 HttpContext,但我收到一个 InvalidCastException 说明,“无法将类型为 'Castle.Proxies.HttpRequestBaseProxy' 的对象转换为类型 'System.Web.HttpContextWrapper'。”

【问题讨论】:

  • 你有什么问题?
  • 我很抱歉不清楚这一点......对于初学者来说,HttpRequest 无法被嘲笑。我得到一个 NotSupportedException ,“要模拟的类型必须是接口或抽象或非密封类”。我试过分别使用 HttpRequestBase 和 HttpContextWrapper 代替 HttpRequest 和 HttpContext,但我收到一个 InvalidCastException 说明,“无法将类型为 'Castle.Proxies.HttpRequestBaseProxy' 的对象转换为类型 'System.Web.HttpContextWrapper'。”

标签: unit-testing httprequest moq httpcontext system.net


【解决方案1】:

Moq 不能从类本身创建 Mock 对象,您必须在代码中创建(并使用)一个接口,然后从中创建一个 Mock。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 2017-12-27
    • 2019-08-23
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多