【发布时间】:2014-09-19 15:31:03
【问题描述】:
我有一个 web api 2 web 服务获取方法。在里面我使用的是 HttpContext.Current.Request.UserHostAddress。当直接在他的单元测试中调用我的控制器方法时,这没有填写,所以空对象的错误也是如此。因此,我搜索了如何填写此内容并发现以下内容有助于解决该问题:Add IP address to HttpRequestMessage
但是,这需要一个服务器名称才能将请求发送到。问题是,当测试运行时,需要为这个 API Web 服务运行 VSExpress,而在运行测试时不需要。最重要的是,即使它似乎选择了一个随机端口来运行,所以我不能像他在上面的链接中那样对地址进行硬编码。鉴于上述问题,我如何测试我的 api 2 方法?
这是我刚测试api方法时爆炸的那一行
string ip = HttpContext.Current.Request.UserHostAddress;
[编辑]回答
让每个人都知道这里是代码中的解决方案
public class MyController : ApiController
{
private: HttpRequestBase httpRequest;
public MyController()
{
httpRequest = new HttpRequestWrapper(HttpContext.Current.Request)
}
public MyController(HttpRequestBase http)
{
httpRequest = http;
}
public HttpResponseMessage Get()
{
string ip = httpRequest.UserHostAddress;
}
}
我在单元测试中使用 Moq:
Mock<HttpRequestBase> httpRequestMock = new Mock<HttpRequestBase>();
httpRequestMock.Setup(x => x.UserHostAddress).Returns("127.0.0.1");
// then pass httpRequestMock.Object to my controller ctor and good to go
【问题讨论】:
-
如果您愿意更改您的代码 - 只需将“给我用户 IP”功能作为您的类的依赖项(即,如果您使用某些 DI 框架,则将
IGiveMeRequestInformation之类的接口传递给控制器的构造函数) 并模拟它进行测试。
标签: c# unit-testing asp.net-web-api2