In-Memory HttpServer如何知道要托管哪个WebAPI项目?

pur*_*uri 14 c# asp.net integration-testing asp.net-web-api

我想使用流行的内存托管策略对WebAPI项目运行测试.

我的测试位于一个单独的项目中.

这是我考试的开始

    [TestMethod]
    public void TestMethod1()
    {
        HttpConfiguration config = new HttpConfiguration();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional});

        HttpServer server = new HttpServer(config);
        HttpMessageInvoker client = new HttpMessageInvoker(server)
    }
Run Code Online (Sandbox Code Playgroud)

使用HttpServer初始化客户端,建立直接的客户端 - 服务器连接.

除了提供路由配置信息之外,HttpServer如何知道要托管哪个WebAPI项目?

如何同时托管多个WebAPI项目?

似乎HttpServer能够找到WebAPI项目的神奇功能吗?

谢谢

Kir*_*lla 17

Web API依赖于一个被调用的服务IAssembliesResolver来获取所有程序集并扫描它们以找到实现该IHttpController接口的控制器.

现在,有时Web API可能无法找到您的控制器,具体取决于程序集是否已加载到当前应用程序域中.在这种情况下,您需要确保已加载程序集.

查看示例测试代码,看起来您没有引用Web API项目中的任何类型,在这种情况下,我假设不会加载Web API项目的程序集.

此外,您似乎在测试中再次注册路线.我建议使用WebApiConfig.Register(HttpConfiguration)您的Web API项目来完成所有注册工作.这样,您将使用与Web API项目相同的设置进行测试.

笔记:

  1. 使用内存服务器运行测试时,您的请求/响应将不会通过格式化程序的序列化/反序列化过程,因为您可能遇到实际问题,这很危险.所以你需要确保照顾这个.很久以前我写了一篇关于此的博客文章.你可以在这里查看.

  2. Fiddler工具在查看原始请求/响应以诊断任何问题时非常有用.如果你正在进行内存测试,你会失去这种能力.


小智 1

Web Api 应该找到所有继承自 ApiController 的控制器。只要您的所有控制器都在同一解决方案中,它就应该可以正常工作。我有一个非常相似的设置,使用内存中的 httpserver 针对另一个项目中的控制器运行测试。这使我能够在单元测试项目中进行非常快速的“集成”测试。