【发布时间】: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