在 Xunit 中使用依赖注入

在 Xunit 中使用依赖注入

Intro

之前写过一篇 xunit 的依赖注入相关的文章,但是实际使用起来不是那么方便

今天介绍一个基于xunit和微软依赖注入框架的“真正”的依赖注入使用方式 ——— Xunit.DependencyInjection, 来自大师的作品,让你在测试代码里使用依赖注入像 asp.net core 一样轻松

使用一览

包引用

在 xunit 测试项目里添加对 Xunit.DependencyInjection 的引用

dotnet add package Xunit.DependencyInjection

新建自己的 Startup

需要实现自己的一个 Startup ,在 Startup 里进行服务注册和初始化

// 这里需要指定一个 assembly attribute 用来让 xunit 寻找测试入口,使用自定义的测试框架
// TestFramework 第一个参数是 Startup 类的 FullName(包含命名空间),第二个参数是测试项目的程序集名称
[assembly: TestFramework("XUnitDependencyInjectionSample.Startup", "XUnitDependencyInjectionSample")]namespace XUnitDependencyInjectionSample
{// Startup 需要继承于 DependencyInjectionTestFrameworkpublic class Startup : DependencyInjectionTestFramework{public Startup(IMessageSink messageSink) : base(messageSink){}// 重写 CreateHostBuilder 这个方法,在这里进行配置注册和服务注册protected override IHostBuilder CreateHostBuilder(AssemblyName assemblyName){var hostBuilder = base.CreateHostBuilder(assemblyName);hostBuilder// 注册配置.ConfigureAppConfiguration(builder =>{builder.AddInMemoryCollection(new Dictionary<string, string>(){{"UserName", "Alice"}}).AddJsonFile("appsettings.json");})// 注册自定义服务.ConfigureServices((context, services) =>{services.AddSingleton<IIdGenerator, GuidIdGenerator>();if (context.Configuration.GetAppSetting<bool>("XxxEnabled")){services.AddSingleton<IUserIdProvider, EnvironmentUserIdProvider>();}});return hostBuilder;}protected override void Configure(IServiceProvider provider){// 有一些测试数据需要初始化可以放在这里}}
}

CreateHostBuilder 其实就是 asp.net core 里的创建一个 HostBuilder ,注册配置/服务和 asp.net core 里一模一样,有数据或配置需要在项目启动时初始化的,可以放在 Configure  方法做,有点类似于 asp.net core 里 Startup 中的 Configure 方法,只是这里我们不需要配置 asp.net core 的请求管道

开始在测试代码里使用依赖注入吧

上面的 Startup 配置好以后就可以在测试代码里尽情使用依赖注入了,来看下面的两个示例:

首先我们可以测试一下内置的服务,就拿 IConfiguration 来测试吧

再来测试一下我们自定义注册的服务:

IOutputHelper 是 xunit 提供的,可以在执行测试的时候输出一段文本(使用 Console.WriteLine 是看不到输出的哦)

来看一下测试结果

实现原理

Xunit.DependencyInjection 是一个开源项目,你可以在 Github 上获取到源码 https://github.com/pengweiqhca/Xunit.DependencyInjection

Xunit.DependencyInjection 重写了一套基于 Microsoft.Extensions.DependencyInjection TestFramework

使得测试执行可以支持依赖注入的方式,

在构建测试类时可以从注册的服务中获取构造器所需要的参数

在构建测试方法的时候也可以通过指定 FromServices 来从注册的服务中获取对应的服务从而实现方法参数的注入

重写的 xunit 的类如下

从 5.0 版本开始直接依赖于 Microsoft.Extensions.Hosting,使用通用主机来构建依赖注入测试框架,

这样使得我们更方便集成 Configuration ,更像 asp.net core 的配置,更简洁

More

大师写的项目真心不错,但是大师太低调了,写的很多很实用的项目,携程的阿波罗的 dotnetcore 支持就是大师一直在维护,,大家快去 Github follow 他吧

大师最近在写一个 NetCache 的开源项目,一个缓存框架,感兴趣的可以去看一下,给大师提点 feature ,

项目地址:https://github.com/pengweiqhca/NetCache

Reference

  • https://github.com/pengweiqhca/Xunit.DependencyInjection

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/XUnitDependencyInjectionSample

  • https://github.com/pengweiqhca/NetCache

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

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

相关文章

C#由转换二进制所引起的思考,了解下?

【导读】最近遇到很有意思转换二进制的问题&#xff0c;有部分童鞋俨然已了解&#xff0c;可能也有一部分童鞋没碰到过也就不知情&#xff0c;这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时&#xff0c;非常开心&#xff0c;收到再一次连任MVP的邮件&#xff0c…

.Net Core In Docker 在容器内编译并发布

Docker可以说是现在微服务&#xff0c;DevOps的基础&#xff0c;咱们.Net Core自然也得上Docker。.Net Core发布到Docker容器的教程网上也有不少&#xff0c;但是今天还是想来写一写。你搜.Net core程序发布到Docker网上一般常见的有两种方案&#xff1a;1、在本地编译成Dll文件…

带你深入探究云原生时代的分布式操作系统 Kubernetes

过去几年&#xff0c;以 docker、kubernetes 为代表的容器技术已发展为一项通用技术&#xff0c;BAT、滴滴、京东、头条等大厂&#xff0c;都争相把容器和 k8s 项目作为技术重心&#xff0c;试图“放长线钓大鱼”。就说腾讯吧&#xff0c;目前基本所有业务都跑在云上&#xff0…

C# 9.0 新特性之 Lambda 弃元参数

阅读本文大概需要不到 1 分钟。弃元&#xff08;Discards&#xff09; 是在 C# 7.0 的时候开始支持的&#xff0c;它是一种人为丢弃不使用的临时虚拟变量。语法上它是用来赋值的&#xff0c;但它却不被分配存储空间&#xff0c;即没有值&#xff0c;所以不能从中读取值。弃元用…

应用交付老兵眼中的Envoy, 云原生时代下的思考

Envoy 是云原生时代的明星&#xff0c;其本质是反向代理负载均衡类软件&#xff0c;领域上归于应用交付&#xff0c;那么作为应用交付领域的老兵如何看待 Envoy&#xff0c;Envoy 又引发了哪些关于传统应用交付领域的思考&#xff1f;关于作者林静&#xff0c;F5 软件方向解决方…

asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!

背景最近一段时间&#xff0c;陆陆续续的把手里头项目都迁移到了k8s中&#xff0c;期间遇到很多的坑&#xff0c;并且也学到了许多k8s的知识&#xff08;从0-1&#xff09;&#xff0c;大家都知道k8s中的一大特性是自动扩容&#xff0c;对此结合自己的业务发现很是有“用武之地…

如何优雅做系统错误提示?

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「149」篇原创敬上大家好&#xff0c;我是Z哥。不管是日常的工作中还是生活中&#xff0c;我们每天会用到很多软件系统。不知道你有没有过这样的感受&#xff0c;当…

搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目

前言伴随着随着微服务概念的不断盛行&#xff0c;与之对应的各种解决方案也层出不穷。这毕竟是一个信息大爆发的时代&#xff0c;各种编程语言大行其道&#xff0c;各有各的优势。但是有一点未曾改变&#xff0c;那就是他们服务的方式&#xff0c;工作的时候各司其职&#xff0…

如何在ASP.NET Core中集成ElasticSearch

本文来自&#xff1a;https://www.blexin.com/en-US/Article/Blog/How-to-integrate-ElasticSearch-in-ASPNET-Core-70图片我敢打赌&#xff0c;您肯定会被要求向Web应用程序中添加高级搜索功能&#xff0c;而且通常是全文的类似Google的搜索。在技术电子商务的开发过程中&…

了解下C#由转换二进制所引起的思考

【导读】最近遇到很有意思转换二进制的问题&#xff0c;有部分童鞋俨然已了解&#xff0c;可能也有一部分童鞋没碰到过也就不知情&#xff0c;这里我们来深入学习下转换二进制所带来的问题。在写此篇文章时&#xff0c;非常开心&#xff0c;收到再一次连任MVP的邮件&#xff0c…

如何利用.NETCore向Azure EventHubs准实时批量发送数据?

最近在做一个基于Azure云的物联网分析项目&#xff1a;.netcore采集程序向Azure事件中心(EventHubs)发送数据&#xff0c;通过Azure EventHubs Capture转储到Azure BlogStorage&#xff0c;供数据科学团队分析。为什么使用Azure事件中心&#xff1f;Azure事件中心是一种Azure上…

C++实现二叉树

代码如下: #include<iostream> #include <queue> #include <stack> using namespace std;class BinTree { private:class TreeNode{public:int data;TreeNode *left;TreeNode *right;TreeNode ():data(0),left(nullptr),right(nullptr){}TreeNode(int e):da…

MySql :Could not create connection to database server.

错误&#xff1a; Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:Error querying database. Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. The error …

Vue 3拖更,尤雨溪介绍最新进展

Vue.js 作者尤雨溪近日介绍了 Vue 3 的最新进展。尤雨溪表示&#xff0c;由于在 Vue 3 上花费的大部分时间都投入到了设计和构建稳定的内核上&#xff0c;不过要让整个框架处于"ready"状态&#xff0c;不仅仅是内核的问题&#xff0c;还需要有兼容版本的支持库 &…

Mysql@和@@符号的详细使用说明

一、概述 是用户变量&#xff0c;是系统变量。 二、使用语法及实践 用户自定义变量 1、用户定义变量语法 SET var_name expr [, var_name expr] 如&#xff1a;set t1 100; 2、获取用户定义变量值方式&#xff0c;如&#xff1a; select t1 from dual; 如下图 系统变…

探讨NET Core数据进行3DES加密或解密弱密钥问题

【导读】之前写过一篇《探讨.NET Core数据进行3DES加密和解密问题》&#xff0c;最近看到有人提出弱密钥问题&#xff0c;换个强密钥不就完了吗&#xff0c;猜测可能是与第三方对接导致很无奈不能更换密钥&#xff0c;所以产生本文解决.NET Core中3DES弱密钥问题&#xff0c;写…

C++实现表达式树

代码如下: #include <iostream> #include <string> #include <stack> #include <queue> using namespace std;class Tree { private:class Node{public:char val;Node * left;Node *right;Node(char val):val(val),left(nullptr),right(nullptr){}Nod…

redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

前段时间在做用户画像的时候&#xff0c;遇到了这样的一个问题&#xff0c;记录某一个商品的用户购买群&#xff0c;刚好这种需求就可以用到Redis中的Set&#xff0c;key作为productID&#xff0c;value就是具体的customerid集合&#xff0c;后续的话&#xff0c;我就可以通过p…

IDEA如何在包下建立子包

idea如何在包下建立子包 第一次在包下建立子包时候出现了问题 在java > springmvc包下再new上一个package controller的时候就会出现这个样子 如何解决 在IDEA2019 中的Show Options Menu下有一个Compacket Middle Packages将它关闭即可 解决成功

.NET Core微服务开发选项

微服务开发的关注点有哪些&#xff1f;微服务构最终的目标是实现业务的价值&#xff0c;交付&#xff0c;为了让开发人员更加关注业务开发和交付&#xff0c;微服务需要一些比较底层的基础设置&#xff0c;我们也称为微服务公共关注点。配置管理&#xff1a;对微服务可变参数进…