web API2 host in IIS 用Owin Host实现脱离IIS跑Web API单元测试 - IIS - 服务器之家

服务器之家

专注于服务器技术!
当前位置:首页 > Web服务器 > IIS

web API2 host in IIS 用Owin Host实现脱离IIS跑Web API单元测试

发布时间:2017-04-24 来源:服务器之家

  今天在开发一个 Web API项目写单元测试时,实在无法忍受之前的笨方法,决定改过自新。

  之前Web API的单元测试需要进行以下的操作:

  初始配置:

  1)在IIS中创建一个站点指定Web API项目

  2)在hosts加上该站点的IP地址解析

  每次修改代码:

  3)修改代码之后按F6编译

  4)用运行单元测试

  一看就知道这个方法好土、好笨、好受罪。理想的方式应该是:无需任何初始配置,修改代码之后无需按F6编译,直接运行单元测试,一步完成操作。

  今天在受不了旧方式的折磨、经不起理想方式的诱惑的情况下,下定决心要解决这个问题,最终通过Owin Host实现了,通过这篇博文分享一下。

  用Owin Host实现的思路很简单,就是在单元测试中以Owin Host运行 Web API站点,然后单元测试代码直接请求这个Owin Host站点进行测试。

  我们的Web API项目是基于 4.5 + Web API 5.2.3开发的,没有OWIN相关的代码,所以先要在Web API项目中添加一些代码 ,以让Owin Host能够加载之。

  首先nuget安装Owin包包(IAppBuilder在此包中):

  PM> Install-Package Owin

  然后添加Startup.cs:

  public class Startup

  {

  public void Configuartion(IAppBuilder app)

  {

  }

  }

  在Startup.Configuratrion方法中添加代码,调用WebApiConfig.Register方法(这个是之前已经实现的,路由配置就在其中)配置HttpConfiguration,然后将之注册到OWIN的管线中。

  public class Startup

  {

  public void Configuration(IAppBuilder app)

  {

  var configuraton = new HttpConfiguration();

  WebApiConfig.Register(configuraton);

  app.UseWebApi(configuraton);

  }

  }

  Web API项目只需这样简单改造一下,就可以支持Owin Host,无任何副作用,不影响用IIS部署站点。

  单元测试代码的改造也很简单,只需在跑测试之前用Microsoft.Owin.Hosting中的WebApp.Start()方法加载Web API站点。

  首先nuget安装Owin Host的包包:

  PM> Install-Package Microsoft.Owin.Hosting

  PM> Install-Package Microsoft.Owin.Host.HttpListener

  接着在测试类的构造函数中用WebApp.Start()启动Web API站点:

  public class CommentsWebApiTest : IDisposable

  {

  private IDisposable _webApp;

  public CommentsWebApiTest()

  {

  _webApp = WebApp.Start<Startup>(HOST_ADDRESS);

  Console.WriteLine("Web API started!");

  }

  public void Dispose()

  {

  _webApp.Dispose();

  }

  }

  然后就可以脱离IIS无比轻松地进行Web API的单元测试了。

  下面来实际体验一下:

  1)在Web API项目中实现一个ApiController

  public class CommentsController : ApiController

  {

  [Route("blogposts/{postId}/comments")]

  public async Task<IHttpActionResult> Get(int postId)

  {

  var comments = new Comment[] { new Comment {

  PostId = postId,

  Body = "Coding changes the world1" } };

  return Ok<Comment[]>(comments);

  }

  }