.NET6之MiniAPI(二十九):UnitTest

MiniAPI的单元测试与asp.net web api的单元测试大体是相同的(毕竟都是asp.net core),只是在小细节上有一些差异,文章中会说到这点。

本文测试框架是XUnit,Mock框架是Moq,关于这两个框架和库的学习,这里就忽略了。

首先创建两个项目,API项目MiniAPI19UnitTest,UnitTest项目MiniAPI19UnitTestUT,如下:

MiniAPI19UnitTest

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IOrderService, OrderService>();
var app = builder.Build();app.MapGet("/order", (IOrderService orderService) =>
{return "Result:" + orderService.GetOrder("123");
});
app.MapPost("/order", (Order order, IOrderService orderService) =>
{return "Result:" + orderService.AddOrder(order);
});
app.Run();public interface IOrderService
{bool AddOrder(Order order);string GetOrder(string orderNo);
}
public class OrderService : IOrderService
{private readonly ILogger<OrderService> _logger;public OrderService(ILogger<OrderService> logger){_logger = logger;}public string GetOrder(string orderNo){return "this is my order,orderno:" + orderNo;}public bool AddOrder(Order order){_logger.LogInformation(order.ToString());return true;}
}
public record Order
{public string OrderNo { get; set; }public string Name { get; set; }public decimal Price { get; set; }
}

MiniAPI19UnitTestUT:在本项目中添加引用MiniAPI19UnitTest项目

using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Moq;
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;
namespace MiniAPI19UnitTestUT
{public class MiniAPI19Test{    [Fact]//无参测试public async Task GetOrderTest(){var orderNo = "abcd";//用Moq来mock  server接口,达到层的隔离var mock = new Mock<IOrderService>();mock.Setup(x => x.GetOrder(It.IsAny<string>())).Returns(orderNo);var myapp = new MyAppHostTest(services => services.AddSingleton(mock.Object));var client = myapp.CreateClient();var result = await client.GetStringAsync("/order");Assert.Equal($"Result:{orderNo}", result);}[Theory]//有参测试[InlineData(true)][InlineData(false)]public async Task PostOrderTest(bool backResult){var mock = new Mock<IOrderService>();mock.Setup(x => x.AddOrder(It.IsAny<Order>())).Returns(backResult);var myapp = new MyAppHostTest(services => services.AddSingleton(mock.Object));var client = myapp.CreateClient();var content = new StringContent(System.Text.Json.JsonSerializer.Serialize(new Order{OrderNo = "abcd",Name = "Surface Pro 8",Price = 10000}),System.Text.Encoding.UTF8,"application/json");var response = await client.PostAsync("/order", content);var result = await response.Content.ReadAsStringAsync();Assert.Equal($"Result:{backResult}", result);}}//本类是加构我们MiniAPI web host的类型,封装后以供测试程序调用class MyAppHostTest : WebApplicationFactory<Program>{private readonly Action<IServiceCollection> _services;public MyAppHostTest(Action<IServiceCollection> services){_services = services;}protected override IHost CreateHost(IHostBuilder builder){builder.ConfigureServices(_services);return base.CreateHost(builder);}}
}

上面的代码会报错,找不到Program的,这是因为API项目是用Top Level的方式来开发的,Program的访问修饰符是internal,虽然添加引用了MiniAPI19UnitTest项目,但Program是访问不到的,这里有两个解决方案,要么不用Top Level,如下面这样写代码:

public class Program
{static void Main(string[] args){var builder = WebApplication.CreateBuilder(args);builder.Services.AddScoped<IOrderService, OrderService>();var app = builder.Build();app.MapGet("/test", (IOrderService orderService) =>{return "Result:" + orderService.GetOrder("123");});app.Run();}
}

或者在MiniAPI19UnitTest.csproj文件中添加如下配置,让测试项目能访问到Program

<ItemGroup><InternalsVisibleTo Include="MiniAPI19UnitTestUT"/></ItemGroup>

用反射工具查看API项目结果如下,Main函数是Top-Level Entry Point方式,也看不到Program

aeb51f032152af7f1845397fa02b9f2f.png

这时,就可以开心地写自己的单元测试了。

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

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

相关文章

vue data数据修改_Vue 超清晰思维导图(7张),详细知识点梳理!

Vue思维导图目录MVC与MVVM的区别Vue基本代码结构Vue指令Vue组件class和style动态绑定computed计算属性EventBusfilter过滤器方法Vue是一套构建用户界面的框架&#xff0c;只关注视图层&#xff0c;它不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。&#xff08;Vue有…

转帖不会乱码的,powershell网络蜘蛛

抓取&#xff08;爬取&#xff09;网上信息的脚本程序&#xff0c;俗称网络蜘蛛。powershell中自带了这样的两个命令&#xff0c;【Invoke-WebRequest】和【Invoke-RestMethod】&#xff0c;但这两个命令有时候会乱码。 现在转帖分享&#xff0c; 某个【歪果仁】写的脚本。来源…

Linux上搭建nginx,及简单配置

在上家公司都是运维安装nginx&#xff0c;到新公司后代码开发完成部署测试服务器要求自己装nginx&#xff0c;研究了好久安装好之后&#xff0c;到正式上线还要自己安装&#xff0c;索性把安装步骤自己记载下来&#xff08;好大一部分都是在网站找的&#xff09;。一&#xff0…

c语言打开文件并输出,文件的读取,c语言打开文件并输出

文件的读取&#xff0c;c语言打开文件并输出在做数据分析的过程中&#xff0c;经常会遇到文件的读取。我想很多人都在这个环节遇到过问题&#xff0c;所以就把自己掌握的一些文件读取方法记录下来&#xff0c;以及过程中遇到的一些状况和解决方法列出来&#xff0c;以便交流。o…

IOS学习笔记十六(NSString和NSMutableString)

1、NSString和NSMutableString NSString是不变字符串类&#xff0c;有点像java里面的String,NSMutableString是可变字符串类&#xff0c;有点类似java里面的StringBuffer 2、测试demo int main(int argc, char * argv[]) {autoreleasepool {unichar data[6] {97, 98, 100, 1…

产品经理书籍

《结网》 part1 做产品的几个要点&#xff1a;出处、目标、 壁垒、 受益人群、 商业模式、 平台现金牛、战略部署。 一个概念是否可以被有效执行出来比概念的本事更重要 要有坚定的决心更要有合理的发展路线 part2 传说中的风投&#xff1a;&#xff08;投资你的个人品质和你对…

界面连接数据库

1、获取本机的SQL Server服务器名 private void Form2_Load(object sender, EventArgs e){listBox1.Items.Clear();SQLDMO.Application SQLServer = new SQLDMO.Application();SQLDMO.NameList strServer = SQLServer.ListAvailableSQLServers();if (strServer.Count > 0){f…

Xamarin效果第二十篇之GIS中加载三维白模

在前面文章中简单玩了玩GIS的基本操作、Mark相关、AR和测距,今天再次分享一下N年前就像玩耍的效果;啥也不说了都在效果里:再来看看手机端的效果:1、关于效果我也是偶然见看到了别人实现:https://blog.csdn.net/arcgis_all/article/details/769991042、关于实现就是在三维场景图…

visa虚拟卡生成器_虚拟卡有哪些功能?赶紧了解一下

现在很多人都会有机会出国&#xff0c;或者是直接在国外生活&#xff0c;他们时不时的会到国内办理一些事情&#xff0c;而这个时候为了确保信用卡在使用的时候安全&#xff0c;有些人就会申请使用虚拟信用卡&#xff0c;这样不但可以解决跨国支付的麻烦&#xff0c;从而确保在…

35个Java代码性能优化总结

代码优化的目标是&#xff1a; 1、减小代码的体积 2、提高代码运行的效率 代码优化细节&#xff1a; 1、尽量指定类、方法的final修饰符 带有final修饰符的类是不可派生的。为类指定final修饰符可以让类不可以被继承&#xff0c;为方法指定final修饰符可以让方法不可以被重写。…

android编程绘图,Android编程绘图操作之弧形绘制方法示例

本文实例讲述了Android编程绘图操作之弧形绘制方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/*** 绘制弧形图案* description&#xff1a;* author ldm* date 2016-4-25 下午4:37:01*/public class ArcsActivity extends Activity {Overrideprotected void onCr…

JS多个对象添加到一个对象中

var obj1 {"qq":10}; var obj2{"mm":2,"nn":3}; var obj3{"xx":1,"yy":5}; obj1.field1 obj2; obj1.field2 obj3; console.log(obj1)转载于:https://www.cnblogs.com/thiaoqueen/p/7111697.html

Caffe cuDNN

Ref: http://jetsonhacks.com/2015/01/20/nvidia-jetson-tk1-cudnn-install-caffe-example/ 转载于:https://www.cnblogs.com/nn0p/p/4351026.html

linux平台之如何查看svn账号

1、平台 在ubuntu 2、如何查看svn账号 1)、 到svn.simple目录 cd ~/.subversion/auth/svn.simple 2&#xff09;、然后在svn.simple目录下查看文件 这个目录很多文件&#xff0c;我们随便cat/vim一下就可以看到了

C#将dataGridView中显示的数据导出到Excel(大数据量超实用版)

开发中很多情况下需要将dataGridView控件中显示的数据结果以Excel或者Word的形式导出来,本例就来实现这个功能。由于从数据库中查找出某些数据列可能没必要显示出来,在dataGridView中将对应的列隐藏了,这时导出时就会将隐藏的列导出来,显然不是我们所预期的。做法是先将dat…

BeetleX实现MessagePack和Protobuf消息控制器调用websocket服务详解

最近有用户问如何使用BeetleX封装一个基于Protobuf格式的websocket服务并支持控制器调用&#xff1b;其实BeetleX.FastHttpApi是支持Websocket服务和自定义数据格式的&#xff0c;但需要对组件有一定了解的情况才能进行扩展&#xff1b;接下来通过封装一个支持Protobuf和Messag…

vue 获取url地址的参数_2020年 vue常见面试问题总结(干货)!

1.什么是mvvm模式&#xff0c;谈谈你的理解&#xff1f; MVVM - Model View ViewModel&#xff0c;数据&#xff0c;视图&#xff0c;视图模型view 可以通过 事件绑定 的方式影响 model&#xff0c;model 可以通过 数据绑定 的形式影响到view&#xff0c;viewModel是把 model 和…

CSS 定位之绝对与相对

static,relative,absolute,fixed含义 static(静态定位):元素框正常生成。块级元素生成一个矩形框&#xff0c;作为文档流的的一部分&#xff0c;行内元素则会常见一个或多个行框&#xff0c;至于其父元素中。默认值。没有定位&#xff0c;元素出现在正常的流中&#xff08;忽略…

理解云计算备份与灾难恢复

如今&#xff0c;云计算和用户生态系统有一个新的转变&#xff0c;IT的转化创造了一个独特的“数据需求”环境。这意味着有放在这些工作负荷的详细的信息工作和更大的恢复需求。IT管理人员负责管理他们的备份系统&#xff0c;并必须准备好他们的灾难恢复策略。适当的恢复方法是…

SQL Server CLR 集成简介

公共语言运行库 (CLR) 是 Microsoft .NET Framework 的核心,为所有 .NET Framework 代码提供执行环境。 在 CLR 中运行的代码称为托管代码。 CLR 提供执行程序所需的各种函数和服务,包括实时 (JIT) 编译、分配和管理内存、强制类型安全性、异常处理、线程管理和安全性。 …