使用HttpClient在ASP.NET WebApi单元测试场景中的应用

9
我有一个集成测试,我想将其用作测试我的WebAPI控制器的基础。
起初,我认为我必须在自托管模式下设置WebAPI,并通过本地Http进行端到端测试。
然而,后来我通过查看WebApiContrib项目中的测试发现,可以使用正确的服务路由设置HttpClient和HttpServer,从而无需在自托管模式下设置WebApi。我似乎可以对控制器进行单元测试。在客户端请求中,我可以放入任何域名,HttpClient似乎会自动绑定到正确的控制器。
这里是否有任何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;

}
1个回答

9

HttpClient具有可插拔的管道模型。通常情况下,当您创建一个HttpClient时,您会得到一个默认的请求处理器HttpClientHandler实例。HttpClientHandler实际上执行HttpWebRequest。HttpClientHandler派生自HttpMessageHandler。

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

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


那么它如何知道如何直接调用处理程序呢?HttpServer不也用于网络连接吗? - jaffa
@jaffa HttpClient将所有请求发送到提供给它的HttpMessageHandler。HttpServer位于处理所有网络相关事务的主机上。可以是IIS、WCF自托管或其他Owin主机。 - Darrel Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接