在 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语言)

代码如下: /* 图的邻接表表示法 */#define MaxVertexNum 100 /* 最大顶点数设为100 */ typedef int Vertex; /* 用顶点下标表示顶点,为整型 */ typedef int WeightType; /* 边的权值设为整型 */ typedef char DataType; /* 顶点存储的数据类型设为字…

对一组同构对象用单数组表示法实现(算法导论第十章10.3-2)

对一组同构对象用单数组表示法实现 &#xff08;算法导论第十章10.3-2&#xff09; 考虑到数据安全问题&#xff0c;多用了一个数组来处理安全问题。 #ifndef C11LEARN_SINGULARGROUPSREPRESENTISOMORPHICOBJECTS_H #define C11LEARN_SINGULARGROUPSREPRESENTISOMORPHICOBJEC…

Java实现BST搜索树

代码如下: package BSTree;import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class BSTree {private class TreeNode{int data;TreeNode left;TreeNode right;public TreeNode(int e){data e;left null;…

给定一个n节点的二叉树,写出一个O(n)时间递归过程,将该树每个节点关键字输出(算法导论第十章10.4-2)

给定一个n节点的二叉树&#xff0c;写出一个O(n)时间递归过程&#xff0c;将该树每个节点关键字输出 &#xff08;算法导论第十章10.4-2&#xff09; #include <iostream> template<typename T> void TraverseBinaryTreeIndex(const BinaryTreeNodeIndex<T>…

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

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

给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)

给定一个n节点的二叉树&#xff0c;写出一个O(n)时间非递归过程&#xff0c;将该树每个节点关键字输出&#xff0c;可以使用一个栈作为辅助数据结构 &#xff08;算法导论第十章10.4-3&#xff09; template<typename T> void TraverseBinaryTreeIndexByStack(const Bi…

Java实现堆(最大堆,最小堆)

最大堆代码如下: package MaxHeap;import java.util.Scanner;public class Heap {private int data[];private int size;private int capacity;private final int maxNum 999999999;public Heap(){data new int[101];size 0;capacity 10;data[0] maxNum;}public Heap(int …

.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…

Java实现AVL平衡树

代码如下: package AVLTree;import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class AVLTree {private class TreeNode{private int data;TreeNode left;TreeNode right;private int height;public TreeNo…

辅助类BinaryTreeNodeIndex(用index索引代替指针)

辅助类BinaryTreeNodeIndex (用index索引代替指针&#xff09; template<typename T> class BinaryTreeNodeIndex { public:T key;int left;int right;int parent; public:BinaryTreeNodeIndex(){}BinaryTreeNodeIndex(const T key,int parent -1,int left -1,int ri…

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

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

辅助类BinaryTreeNode(二叉树节点)

辅助类BinaryTreeNode (二叉树节点) template<typename T> class BinaryTreeNode { public:T key;BinaryTreeNode<T>* parent;BinaryTreeNode<T>* left;BinaryTreeNode<T>* right; public:BinaryTreeNode(){}BinaryTreeNode(T key,BinaryTreeNode<…

Java实现Huffman哈夫曼树

代码如下: package HuffmanTree;import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class HuffmanTree {private class TreeNode{private int val;private TreeNode left;private TreeNode right;public Tr…

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

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

给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

给定一个n节点二叉树&#xff0c;写出一个O(n)时间的非递归的过程&#xff0c;将该树每个结点的关键字输出。要求除该树本树的存储空间外只能使用固定量的额外存储空间&#xff0c;且过程中不得修改该树&#xff0c;即使是暂时的修改也不允许。 &#xff08;算法导论第三版第十…

Java实现Huffman哈夫曼树(数组实现)

代码如下: package HuffmanTreeArrays;import java.util.ArrayList; import java.util.Scanner;public class HuffmanTree {private class TreeNode{private int val;private int left;private int right;private int parent;public TreeNode(){val 0;left -1;right -1;par…

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

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

非递归遍历二叉树(算法导论第三版第十章10.4-5)

非递归遍历二叉树&#xff08;算法导论第三版第十章10.4-5&#xff09; template<typename T> void TraverseBinaryTreeNonRecursive(BinaryTreeNode<T>* root) {BinaryTreeNode<T>* prev nullptr;BinaryTreeNode<T>* current root;while (current!…

图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)

邻接表存储的图 - DFS /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visited[]为全局变量&#xff0c;已经初始化为false */ void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ) { /* 以V为出发点对邻接表存储…