我想使用流行的内存托管策略对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项目吗?
由于
答案 0 :(得分:15)
Web API依赖于名为IAssembliesResolver
的服务来获取所有程序集并扫描它们以查找实现IHttpController
接口的控制器。
现在,有时Web API可能无法找到您的控制器,具体取决于程序集是否已加载到当前应用程序域中。在这种情况下,您需要确保已加载程序集。
查看示例测试代码,看来您没有引用Web API项目中的任何类型,在这种情况下,我假设不会加载Web API项目的程序集。
此外,您似乎在测试中再次注册路线。我建议使用Web API项目的WebApiConfig.Register(HttpConfiguration)
来完成所有注册工作。这样,您将使用与Web API项目相同的设置进行测试。
注意:
使用内存服务器运行测试时,您的请求/响应将不会通过格式化程序的序列化/反序列化过程,因为您可能遇到实际问题,这很危险。所以你需要确保照顾这个。很久以前我写了一篇关于此的博客文章。您可以查看here。
Fiddler工具在查看原始请求/响应以诊断任何问题时非常有用。如果您正在进行内存测试,那么您将失去这种能力。
答案 1 :(得分:1)
Web Api应该找到从ApiController继承的所有控制器。只要所有控制器都在同一个解决方案中,它应该可以正常工作。我有一个非常类似的设置,使用内存中的httpserver对另一个项目中的控制器运行测试。这使我能够在单元测试项目中进行非常快速的“集成”测试。
答案 2 :(得分: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)
}