asp.net-web-api - 单元测试场景中带有asp.net WebApi的HttpClient

标签 asp.net-web-api dotnet-httpclient

我有一个集成测试,我想用它作为测试我的 WebAPI Controller 的基础。

最初我认为我必须在自主机模式下设置 WebAPI 并通过本地 Http 执行端到端测试。

但是,我后来通过查看 WebApiContrib 项目中的测试意识到,可以设置一个带有 HttpServer 设置的 HttpClient 以及到 WebAPI Controller 的正确服务路由。我似乎可以对 Controller 进行单元测试,而无需在自托管模式下设置 WebApi。我可以在客户端的请求中输入任何域名,并且 HttpClient 似乎自动神奇地绑定(bind)到正确的 Controller 。

这里是否发生了任何 Http 传输,使用一些本地进程间通信或纯粹“看到”服务器位于同一个应用程序域中并因此使用反射?
发生这种情况的幕后原因是什么?

代码:

[Test]
public void Test_WebApi_Controller()
{
    Assembly.Load("myproj.Web");

    var prodServiceMock = new Mock<IProductService>();
    ObjectFactory.Initialize(x => x.For<IProductService>().Use(prodServiceMock.Object));                      

    var config = new HttpConfiguration();
    config.Routes.MapHttpRoute("default", "webapi/{controller}/{id}", new { id = RouteParameter.Optional });
    config.ServiceResolver.SetResolver(new WebApiDependencyResolver());

    var server = new HttpServer(config);
    var client = new HttpClient(server);

    var response = client.GetAsync("http://anything.com/webapi/product").Result;

}

最佳答案

HttpClient 有一个可插拔的管道模型。通常,当您新建一个 HttpClient 时,您会获得一个 HttpClientHandler 实例作为默认请求处理器。 HttpClientHandler 是实际执行 HttpWebRequest 的那个。 HttpClientHandler 派生自 HttpMessageHandler。

毫无疑问,HttpServer 也派生自 HttpMessageHandler。所以在这个例子中,HttpServer 被传递给 HttpClient 实例以提供它的请求处理。通过将 HttpMessageHandler 传递给 HttpClient 的构造函数,您是在告诉 HttpClient 使用提供的处理程序而不是默认的处理程序。如果您查看 System.Net.Http.WebRequest 中的 WebRequestHandler,您会发现这是从 HttpClientHandler 派生的,并添加了一些特定于 Windows 桌面操作系统的额外功能。

这意味着当您向 HTTPClient 发出请求时,它会直接传递给 HttpServer 消息处理程序,然后像通常在服务器上一样进行处理。

关于asp.net-web-api - 单元测试场景中带有asp.net WebApi的HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10446174/

相关文章:

c# - Newtonsoft.Json DLL 版本与 signalR + WEBAPI 冲突

c# - 在 HttpClient 调用中重用 session cookie

asp.net-mvc - 为什么我的属性路由不起作用?

c# - autofac 是否支持新的 Web Api 2

c# - 字典包含不可为空类型 'id' 的参数 'System.Int32' 的空条目

c# - 'System.Web.Http.HttpConfiguration' 不包含 'EnableQuerySupport' 的定义

asp.net-web-api - Web Api 2 OData 端点中的简单 Web token (SWT) 身份验证

c# - 使用 Httpclient 进行长轮询

.net - HttpClient GetAsync 处置 Webjob 处理程序

c# - 传递凭据适用于 WebRequest,但不适用于 HttpClient