博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebAPI的一种单元测试方案
阅读量:6583 次
发布时间:2019-06-24

本文共 2896 字,大约阅读时间需要 9 分钟。

 
大家是如何对webApi写测试的呢?
  1.利用Fiddler直接做请求,观察response的内容。
  2.利用Httpclient做请求,断言response的内容。
  3.直接调用webApi的action,这种方式的测试跟真实的调用还是有一定差距,不够完美。
  接下来我介绍一种webApi的in-memory调用方法,也能够达到对webApi的测试,并且由于是in-memory调用,效率也比较高,非常适写
单元测试。本文参考了In memory client, host and integration testing of your
Web API service。
  一、首先写一个OrderController用来做测试用
  public class OrderController : ApiController
  {
  // GET api/order
  public Order Get()
  {
  return new Order(){Id = 1,Descriptions = "descriptions",Name = "name"};
  }
  // GET api/order/5
  public string Get(int id)
  {
  return "value";
  }
  // POST api/order
  public Order Post(Order order)
  {
  return order;
  }
  // DELETE api/order/5
  public void Delete(int id)
  {
  }
  }
  
二、WebApi的请求过程
  webApi的核心是对消息的管道处理,整个核心是有一系列消息处理器(HttpMessageHandler)首尾连接的双向管道,管道头为HttpServer,管道尾为HttpControllerDispatcher,HttpControllerDispatcher负责对controller的激活和action的执行,然后相应的消息逆向流出管道。
  所以我们可以利用HttpMessageInvoker将一个请求消息HttpRequestMessage发送到管道中,最后收到的消息HttpResponseMessage就代表一个真实的请求响应。
 
 三、Get请求的测试
  [Test]
  public void GetTest()
  {
  string baseAddress = "http://localhost:33203/";
  HttpConfiguration config = new HttpConfiguration();
  WebApiConfig.Register(config);
  config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
  HttpServer
server = new HttpServer(config);
  HttpMessageInvoker messageInvoker = new HttpMessageInvoker(server);
  CancellationTokenSource cts = new CancellationTokenSource();
  HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, baseAddress + "api/order");
  using (HttpResponseMessage response = messageInvoker.SendAsync(request, cts.Token).Result)
  {
  var content = response.Content.ReadAsStringAsync().Result;
  var result = JsonConvert.DeserializeObject<Order>(content);
  result.Name.Should().Be("name");
  }
  }
  
四、Post请求的测试
  [Test]
  public void PostTest()
  {
  string baseAddress = "http://localhost:33203/";
  HttpConfiguration config = new HttpConfiguration();
  WebApiConfig.Register(config);
  config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
  HttpServer server = new HttpServer(config);
  HttpMessageInvoker messageInvoker = new HttpMessageInvoker(server);
  CancellationTokenSource cts = new CancellationTokenSource();
  HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, baseAddress + "api/order");
  var order = new Order() { Id = 1, Name = "orderName", Descriptions = "orderDescriptions" };
  request.Content = new ObjectContent<Order>(order, new JsonMediaTypeFormatter());
  using (HttpResponseMessage response = messageInvoker.SendAsync(request, cts.Token).Result)
  {
  var content = JsonConvert.SerializeObject(order, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() });
  response.Content.ReadAsStringAsync().Result.Should().Be(content);
  }
  }

转载于:https://www.cnblogs.com/chenlimei/p/9389593.html

你可能感兴趣的文章
我的友情链接
查看>>
CentOS 6.5安装Openldap添加memberof属性
查看>>
Win7打开方式还原,怎么还原打开方式?
查看>>
app上传流程
查看>>
我的友情链接
查看>>
修改浏览器默认滚动条插件
查看>>
ATEN宏正盛装出席Infocomm China 2016
查看>>
SCCM安装及配置过程总结
查看>>
求最大连续bit数
查看>>
卸载KDE / Xfce / LXDE 回到纯Unity 的状态
查看>>
linux
查看>>
今夜杂谈
查看>>
第七章 虚拟化 虚拟机备份 Veeam backup &Replication
查看>>
微软云计算介绍与实践(介绍之五)
查看>>
在linux下搭建HA和LB集群(lvs&heartbeat群集)
查看>>
安装wine
查看>>
阻抗匹配与史密斯(Smith)圆图基本原理
查看>>
路由器与交换机的密码恢复
查看>>
Cisco路由器上的IPSec协议(站点到站点的×××)
查看>>
Java面向对象学习笔记 -- 5(抽象类、接口)
查看>>