当前位置: 首页 > news >正文

C# .net core添加单元测试项目,依赖注入接口测试

目录

    • 创建测试项目
    • 单元测试类,创建项目后,自动生成的
    • InjectUtil.cs
    • ConfigureServices.cs

创建测试项目

项目解决方案上右键,添加---->新建项目,选择适合自己的测试项目,点击【下一步】。我选的xUnit
在这里插入图片描述

单元测试类,创建项目后,自动生成的

using HL.Web.Api;
using HL.Web.Api.Services;
using HL.Web.Platform.Configure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Configuration;
using System.Reflection;
using Microsoft.Extensions.Logging.Console;
using Microsoft.Extensions.Logging.Debug;
using NLog.Web;
using NLog.Extensions.Logging;
using System.Diagnostics;
using HL.Web.Api.Entity.Model.Collect;
using HL.Web.Api.Services.Impl;namespace TestProject1
{/// <summary>/// 单元测试/// </summary>/// <remarks>/// 创建2025-6-17 17:25:43,作者:wanghaoli/// </remarks>public class UnitTest1{IServiceProvider serviceProvider;private IConfiguration configuration;public UnitTest1(){//获取web项目的appsettings.json文件路径string currentDirectory = AppDomain.CurrentDomain.BaseDirectory;string bin = currentDirectory.Substring(0, currentDirectory.LastIndexOf("bin"));bin = bin.TrimEnd('\\');//解决方案目录string slnProject = Directory.GetParent(bin).FullName;var dir = Directory.GetDirectories(slnProject);string? configJsonfilePath = null;foreach (var item in dir){var files = Directory.GetFiles(item);if (files.Length == 0){continue;}configJsonfilePath = files.FirstOrDefault(g => g.Contains("appsettings.json"));if (!string.IsNullOrWhiteSpace(configJsonfilePath)){break;}}//加载配置文件configuration = new ConfigurationBuilder().AddJsonFile(configJsonfilePath).Build();ServiceCollection serviceCollection = new ServiceCollection();ConfigureServices.AddServices(serviceCollection);ConfigureServices.AddSqlsugarSetup(serviceCollection, configuration);serviceCollection.AddLogging(builder =>{builder.ClearProviders();builder.AddConsole();builder.AddDebug();//builder.SetMinimumLevel(LogLevel.Debug);//builder.AddFilter("Logs/log_{Date}.txt"); // 注册 File 提供程序});//自动注册接口、实例InjectUtil.InitServe(serviceCollection);serviceProvider = serviceCollection.BuildServiceProvider();}/// <summary>/// 单条写入/// </summary>/// <returns></returns>[Fact]public async Task Insert(){var collectionDataService = serviceProvider.GetService<ICollectionDataService>();SinterEquipmentCollect info = new SinterEquipmentCollect();info.SingleId = 556;info.SingleName = "测试设备556";long snowId = await collectionDataService.InsertAsync(info);Assert.Equal(snowId.ToString().Length, 19);}/// <summary>/// 批量写入/// </summary>/// <returns></returns>[Fact]public async Task InsertList(){var collectionDataService = serviceProvider.GetService<ICollectionDataService>();List<SinterEquipmentCollect> list = new();for (int i = 0; i < 10; i++){SinterEquipmentCollect info = new SinterEquipmentCollect();info.SingleId = 100 + i;info.SingleName = "测试设备" + info.SingleId;list.Add(info);}int count = await collectionDataService.InsertListAsync(list);Assert.True(count>0);}}
}

InjectUtil.cs

using HL.Web.Api;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace TestProject1
{/// <summary>/// 依赖注入,工具/// </summary>/// <remarks>/// 创建时间:2025-6-17 16:36:43,作者:王浩力/// </remarks>public sealed class InjectUtil{/// <summary>/// 自动注册接口、实例/// </summary>/// <param name="services"></param>/// <param name="serviceLifetime"></param>public static void InitServe(ServiceCollection services, ServiceLifetime serviceLifetime = ServiceLifetime.Scoped){List<Type> types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).Where(w => w.GetCustomAttributes(typeof(ServiceAttribute), false).Length > 0&& w.IsClass && w.IsAbstract != true).ToList();foreach (Type type in types){Type[] interfaces = type.GetInterfaces();interfaces.ToList().ForEach(x =>{switch (serviceLifetime){case ServiceLifetime.Singleton:services.AddSingleton(x, type);break;case ServiceLifetime.Scoped:services.AddScoped(x, type);break;case ServiceLifetime.Transient:services.AddTransient(x, type);break;}});}}}
}

ConfigureServices.cs

using System.Reflection;
using HL.Model.Attributes;
using HL.Web.Api;
using HL.Web.Api.Common.Consts;
using HL.Web.Api.JobServices;
using HL.Web.Platform.Filter;
using Quartz;
using SqlSugar;namespace HL.Web.Platform.Configure
{/// <summary>/// 配置服务/// </summary>public static class ConfigureServices{/// <summary>/// 添加SqlSugar/// </summary>/// <param name="services"></param>/// <param name="config"></param>public static void AddSqlsugarSetup(this IServiceCollection services, IConfiguration config){//读取数据库连接var collectDbConn = config.GetSection(DbConnectionConst.CollectDbConn).Value;var analysisDbConn = config.GetSection(DbConnectionConst.AnalysisDbConn).Value;//注入事务过滤器services.AddScoped<TransactionFilter>();//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行services.AddHttpContextAccessor();//实体、字段映射ConfigureExternalServices configureExternalServices = new ConfigureExternalServices{EntityService = (property, column) =>{var ColumnInfo = property.GetCustomAttribute<ColumnInfoAttribute>();if (ColumnInfo != null){column.IsPrimarykey = ColumnInfo.IsPrimarykey;column.DbColumnName = ColumnInfo.DbColumnName;column.ColumnDescription = ColumnInfo.ColumnDescription;column.IsNullable = ColumnInfo.IsNullable;column.IsOnlyIgnoreUpdate = ColumnInfo.IsOnlyIgnoreUpdate;column.IsJson = ColumnInfo.IsJson;column.DataType = ColumnInfo.DataType;column.SqlParameterDbType = ColumnInfo.SqlParameterDbType;column.IsEnableUpdateVersionValidation = ColumnInfo.IsEnableUpdateVersionValidation;column.IsIgnore = ColumnInfo.IsIgnore;column.Length = ColumnInfo.Length;}else{//最好排除DTO类column.DbColumnName = UtilMethods.ToUnderLine(column.DbColumnName);//ToUnderLine驼峰转下划线方法column.IsNullable = true;}},EntityNameService = (type, entity) =>{var tableInfo = type.GetCustomAttribute<TableInfoAttribute>();if (tableInfo != null){entity.DbTableName = tableInfo.DbTableName;entity.TableDescription = tableInfo.TableDescription;}else{//最好排除DTO类entity.DbTableName = UtilMethods.ToUnderLine(entity.DbTableName);//ToUnderLine驼峰转下划线方法}}};//注册SqlSugarservices.AddTransient<ISqlSugarClient>(client =>{SqlSugarScope sqlSugar = new SqlSugarScope(new List<ConnectionConfig>{new ConnectionConfig(){ ConfigId = DbConnectionConst.CollectDbConn, DbType = DbType.SqlServer, ConnectionString = collectDbConn, IsAutoCloseConnection = true, ConfigureExternalServices = configureExternalServices },new ConnectionConfig(){ ConfigId = DbConnectionConst.AnalysisDbConn, DbType = DbType.SqlServer, ConnectionString = analysisDbConn, IsAutoCloseConnection = true, ConfigureExternalServices = configureExternalServices }},db =>{var serviceBuilder = services.BuildServiceProvider();var logger = serviceBuilder.GetService<ILogger<ApiControllerBase>>();//SQL执行完db.Aop.OnLogExecuted = (sql, pars) =>{//执行完了可以输出SQL执行时间 (OnLogExecutedDelegate)logger?.LogInformation($"ExecutedTime:{db.Ado.SqlExecutionTime}");string sql2 = UtilMethods.GetNativeSql(sql, pars);LogHelpter.AddLog($"{sql2}" );};//单例参数配置,所有上下文生效db.Aop.OnLogExecuting = (sql, pars) =>{获取作IOC作用域对象//var appServive = s.GetService<IHttpContextAccessor>();//var obj = appServive?.HttpContext?.RequestServices.GetService<ILogger>();//Console.WriteLine("AOP" + obj?.GetHashCode());sql = UtilMethods.GetNativeSql(sql, pars);logger?.LogInformation(sql);};db.Aop.OnError = (exp) =>//SQL报错{//获取原生SQL推荐 5.1.4.63  性能OKUtilMethods.GetNativeSql(exp.Sql, exp.Parametres as SugarParameter[]);};db.Aop.OnExecutingChangeSql = (sql, pars) => //可以修改SQL和参数的值{//sql=newsql//foreach(var p in pars) //修改return new KeyValuePair<string, SugarParameter[]>(sql, pars);};db.Aop.DataExecuting = (oldValue, entityInfo) =>{};});return sqlSugar;});}}
}

相关文章:

  • QtitanRibbon为能源工业打造高效应用体验:实现系统中的现代化UI
  • java设计模式[4]之设计型模式
  • qt 实现socket 通讯 demo
  • 一篇文章快速学会HTML
  • 用Go写一个飞书机器人定时发送消息的程序
  • 《企业司法风险监控系统架构设计:从数据采集到T+1实时预警的完整解决方案》
  • macOS版的节点小宝上架苹果APP Store了
  • 碳化硅在轨道车辆永磁牵引电动机的优势和应用
  • 深度解析 Cursor(逐行解析系统提示词、分享高效制定 Cursor Rules 的技巧...)
  • 架构优化——submodule转为subtree
  • 【生活】ECMO原理、作用、费用及使用方法
  • Go语言中的 函数、闭包、defer、错误处理
  • SKUA-GOCAD入门教程-第八节 线的创建与编辑5
  • 黄金价格触及3400美元临界点:AI量化模型揭示美元强势的“逆周期”压制力与零售数据爆冷信号
  • React+Taro创建小程序
  • Mac m1 通过docker镜像安装kafka
  • Smart Input Pro IDEA 插件推荐
  • Redis(2)——AOF持久化
  • 不依赖rerank 模型排序通过使用 PostgreSQL 中的 pgvector 与 tsearch2 函数进行混合搜索提高召回率
  • 机器学习重构光子学设计范式:从智能器件到前沿系统
  • 网站的分页做不好会影响主页/湖南正规seo公司
  • 备案的博客网站可以做别的吗/qq推广平台
  • 见网页制作的公司网站/秦皇岛seo优化
  • 域名注册好了如何做网站/网络营销做得比较成功的企业
  • 东阿做网站多少钱/网店代运营和推广销售
  • 怎样自创广告网站/媒体发稿平台