14

我想使用流行的内存托管策略对 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)
    }

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

除了提供路由配置信息,HttpServer 怎么知道要托管哪个 WebAPI 项目?

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

似乎 HttpServer 在定位 WebAPI 项目方面有一些魔力?

谢谢

4

3 回答 3

17

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

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

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

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

笔记:

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

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

于 2013-05-30T21:05:34.973 回答
1

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

于 2013-05-29T14:02:07.360 回答
0

只需确保将 web api 项目中的任何控制器调用到单独的项目中,以确保 web api 项目加载到内存中。示例:

[TestMethod]
public void TestMethod1()
{

 //// So that the web api project is loaded in-memory
 {webapi Project name}.Controller.{controllerName} = new {controller name}() ;
    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)
}
于 2015-09-14T10:15:14.200 回答