ASP.NET CORE 2.* 利用集成测试框架覆盖HttpClient相关代码

ASP.NET CORE 集成测试官方介绍

我的asp.net core 项目里面大部分功能都是去调用别人的API ,大量使用HttpClient,公司单元测试覆盖率要求95%以上,很难做到不mock HttpClient 达到这个指数。

以下方法是我自己总结的在单元测试里 mock httpClient 的方式,基本思路是利用集成测试框架,mock外部调用的API ,达到httpClient 代码的覆盖。

代码地址:https://github.com/Halo-Shaka/LearningAspNetCoreIntegrationTesting.git

举个例子,创建一个简单的asp.net core 项目,里面只有一个api , api/values, 是个get 方法,

get 方法内部是去调用外部API, 随便写个方法  向google 发一个信息。


[Route("api/[controller]")]

 [ApiController]

 public class ValuesController : ControllerBase

 {

     private readonly IHttpClientFactory _httpClientFactory;

     private readonly IOptions<AppSettings> _options;

     public ValuesController(IHttpClientFactory httpClientFactory, IOptions<AppSettings> options)

     {

         _httpClientFactory = httpClientFactory;

         _options = options;

     }

     [HttpGet]

     public async Task<ActionResult> Get()

     {

         var client = _httpClientFactory.CreateClient();

         var url = _options.Value.Url;

         var payload = new

         {

             From = "China"

         };

         var requestMessage = new HttpRequestMessage(HttpMethod.Post, url)

         {

             Content = new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json")

         };

         try

         {

             var response = await client.SendAsync(requestMessage);

             var content = await response.Content.ReadAsStringAsync();

             if (response.StatusCode == HttpStatusCode.OK)

             {

                 return Ok(content);

             }

             return BadRequest();

         }

         catch (Exception e)

         {

             return StatusCode(502);

         }

     }

 }

这里面有个需要注意的地方,使用注入的httpClient, 外部访问的地址需要是配置的


public class Startup

   {

       public Startup(IConfiguration configuration)

       {

           Configuration = configuration;

       }

       public IConfiguration Configuration { get; }

       public void ConfigureServices(IServiceCollection services)

       {

           services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

           services.AddHttpClient();

       }

       public void Configure(IApplicationBuilder app, IHostingEnvironment env)

       {

           if (env.IsDevelopment())

           {

               app.UseDeveloperExceptionPage();

           }

           else

           {

               app.UseHsts();

           }

           app.UseHttpsRedirection();

           app.UseMvc();

       }

   }

  640?wx_fmt=jpeg

到此为止,基本功能就写完了,现在来写测试代码 

添加 XUnit单元测试项目,添加如下包

Microsoft.AspNetCore.App

Microsoft.AspNetCore.Mvc.Testing

Microsoft.NET.Test.Sdk

Moq

利用集成测试的虚拟站点,把我们需要调用的外部API 伪造出来,

640?wx_fmt=png


MockGatewayData类的作用是 让客户端能够访问到服务端,并指定想要返回的结果
接着创建 GenericWebApplicationFactory,并把刚伪造的 controller 指定到虚拟站点里面,

640?wx_fmt=png


最后写测试代码

640?wx_fmt=png

640?wx_fmt=png


最后看下覆盖率,整个controller 里面httpClient  全都被覆盖了

640?wx_fmt=jpeg

代码地址:

https://github.com/Halo-Shaka/LearningAspNetCoreIntegrationTesting.git

原文链接:https://www.cnblogs.com/MindSharing/p/11283980.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Let's Encrypt网站推出中文版

如今很多网站都强制使用 HTTPS 加密协议访问&#xff0c;安全性有了很大的提高&#xff0c;最起码在数据传输的初始阶段数据包不会被劫持&#xff0c;保证了客户端与服务器端的通讯安全性。说到 HTTPS 加密协议&#xff0c;就不得不提 Let’s Encrypt。Let’s Encrypt 是一家不…

使用WebDeploy部署远程IIS网站

目录 使用WebDeploy部署远程IIS网站后台服务部署服务器配置本地WebDeploy发布文件配置前端页面部署WebDeploy服务端配置WebDeploy发布文件配置使用WebDeploy部署远程网站后台服务部署服务器配置打开IIS管理器(开始->控制面板->管理工具->IIS管理器)添加网站(右键网站…

CF436F Banners(分块/凸包/单调队列)

CF436F Banners 首先有n个物品分别有ai和bi&#xff0c;然后定义价值为 c∗wp∗(ai大于p且bi小于c的用户个数)c*wp*(ai大于p且bi小于c的用户个数)c∗wp∗(ai大于p且bi小于c的用户个数) 然后我们需要求解对于每一个c的最大价值和对应的p 首先我们先枚举c&#xff0c;然后每次加…

译 | 改进 Visual Studio 及 Windows 上 .NET Core 的安装体验

点击上方蓝字关注“汪宇杰博客”原文&#xff1a;Lee Coward翻译&#xff1a;Edi Wang导语Visual Studio 2019 16.3 和 .NET Core 3.0 Preview 7 改进了 Windows 上 .NET Core 的安装体验。目标是减少计算机上可能存在的 .NET Core 版本的数量。这些改进基于客户反馈和我们自己…

SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)

来源&#xff1a;https://www.cnblogs.com/7tiny/p/11348785.html【前言】本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目。目录如下&#xff1a;SonarQube系列一、Linux安装与部署SonarQube系列二、分析dotnet core/C#代码SonarQube系列三、Jen…

CF198D Cube Snake(三维空间/增量构造)

CF198D Cube Snake n<50 显然是一个构造题&#xff0c;然后很容易想到增量构造&#xff0c;可以考虑每次保证一层值域连续&#xff0c;然后再增加一个值域连续的层&#xff0c;就会产生两个值域连续的正方体&#xff0c;但是只移动头是不够的&#xff0c;所以我们还需要移…

发布ABP v0.19包含Angular UI选项

ABP v0.19已发布,包含解决的~90个问题和600次提交.新功能Angular UI终于,ABP有了一个SPA UI选项,使用最新的Angular框架.Angular的集成不是简单地创建了一个启动模板.创建了一个基础架构来处理ABP的模块化,主题和其他一些功能.此基础结构已部署为NPM包.为帐户,身份和租户管理等…

P4151 [WC2011]最大XOR和路径(线性基应用)

P4151 [WC2011]最大XOR和路径 思路 如果单纯的只是树形图&#xff0c;那么答案显然易见只有一种&#xff0c;也就是从头到尾的路径从头到尾的异或值&#xff0c;但是这里不同的就是有可能在道路上有许多的环。 题目有一个重点提示的一句话 理解这句话之后那么我们可以显然…

Docker(一)-CentOS7中安装Docker视频教程

一、前言Docker的使用越来越多&#xff0c;安装也相对简单。本文使用视频的方式展示在CentOS7系统中安装Docker&#xff0c;本文更适合于准备入门学习Docker的童靴&#xff0c;同时也欢迎各路大神给我们指点提建议。二、环境CentOS7三、安装Docker确认Linux内核版本# uname -a卸…

CF773E Blog Post Rating(推导min的通项/线段树)

CF773E Blog Post Rating 现在有一个值F&#xff0c;每次如果序列加入一个数后重新排列&#xff0c;每次如果F小于期望值&#xff0c;就会1&#xff0c;如果等于就不变&#xff0c;如果大于就-1&#xff0c;求解每一次加入后F的最大值。 这道题的确是非常的巧妙&#xff0c;尤…

用Keras.NET 做一个图像识别的训练

.NET Core 的应用场景越来越广&#xff0c;开源社区也不断壮大&#xff0c; .NET Core在机器学习领域不断发展ML.NET外&#xff0c;也通过结合Tensorflow.NET去完善ML.NET在深度学习领域的功能&#xff0c;在ML.NET 1.3开始迈出了非常重要的一步。这不仅是微软拥抱开源的策略&a…

「数据ETL」从数据民工到数据白领蜕变之旅(六)-将Python的能力嫁接到SSIS中...

前一篇推文中&#xff0c;给大家演示了在SSIS上使用dotNET脚本&#xff0c;实现一些原生SSIS难以实现的功能&#xff0c;并冠以无限可能的说法。充分复用python的现有优势python的确是一门非常优秀的编程语言&#xff0c;特别是在数据领域&#xff0c;网络爬虫、数据处理、分析…

.NET Core玩转爬虫系列之借助正则表达式入门篇

接下来一段时间&#xff0c;我会花些时间研究C#玩转爬虫的方法及其实践。话不多说&#xff0c;开始吧~一般来说:设计并实现一个爬虫的步骤是:模拟登录 -> 模拟发送request请求 -> 取回response数据 -> 提取所需信息并将其进行重新组织 -> 存入DB或文件中 -> 后期…

ASP.NET Core on K8S深入学习(5)Rolling Update

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。01—What is Rolling Update?为了服务升级过程中提供可持续的不中断的服务&#xff0c;K8S提供了Rolling Update机制&#xff0c;它可以使得服务近乎无缝地平滑升级&…

依赖注入在 dotnet core 中实现与使用:1 基本概念

关于 Microsoft Extension: DependencyInjection 的介绍已经很多&#xff0c;但是多数偏重于实现原理和一些特定的实现场景。作为 dotnet core 的核心基石&#xff0c;这里准备全面介绍它的概念、原理和使用。这里首先介绍概念部分。1. 概念该项目在 GitHub 的地址&#xff1a;…

【LOJ#572】Misaka Network 与求和(莫比乌斯反演/杜教筛/min_25筛)

【LOJ#572】Misaka Network 与求和 https://www.cnblogs.com/cjyyb/p/10170630.html 看到次大质因子就可以想到是min_25筛了&#xff0c;然后只需要做莫比乌斯反演&#xff0c;然后预处理整除分块点的前缀和&#xff0c;然后再结合杜教筛即可。

软件设计的第一性原理:结构化抽象

软件设计的第一性原理&#xff0c;是结构化抽象。术生于道&#xff0c;技术生于原理。引语所谓的第一性原理&#xff0c;就是无论使用什么方法论&#xff0c;都无法绕过的那最最基础的部分。无论是 DDD 设计&#xff0c;还是面向模式的架构设计&#xff0c;或 微服务架构&#…

基于.NetCore结合docker-compose实践Gitlab-CI/CD 排坑指南

引言看过docker-compose真香的园友可能留意到当时是【把部署dll文件拷贝到生产机器】&#xff0c;即时打包成镜像并启动容器&#xff0c;并没有完成CI/CD。经过长时间实操验证&#xff0c;终于完成基于Gitlab的CI/CD实践&#xff0c;本次实践的坑位很多&#xff0c; 实操过程尽…

.NET Core很酷,你不得不知

我一直回想我的第一篇博文&#xff0c;那是关于多个服务的服务器平台的详细教程&#xff0c;它使用 GitLab CI 在 AWS 上&#xff0c;当时使用单个命令行进行部署&#xff0c; 至今回想&#xff0c;令人感觉很酷。前几天&#xff0c;我偶然听说一些软件公司的 HR 在招聘原则上拒…

程序员修神之路--高并发系统设计负载均衡架构

点击上方“蓝字”关注&#xff0c;酷爽一夏菜菜哥&#xff0c;上次你给我讲的分库分表策略对我帮助很大有帮助就好&#xff0c;上次请我的咖啡也很好喝~呵呵&#xff0c;不过随着访问量的不断加大&#xff0c;网站我又加了nginx做负载均衡好呀&#xff0c;看来要进阶高级工程师…