五毒教众崇拜神,空气压缩机,盗情新浪共享
本文使用xunit对asp.net core webapi做单元测试,使用httpclient的同步和异步请求,下面详细介绍xunit的使用过程:
一、创建示例项目
模板为我们自动创建了一个valuescontroller控制器,保留里面的一个get请求和post请求方法,代码如下:
[route("api/[controller]")] [apicontroller] public class valuescontroller : controllerbase { // get api/values/5 [httpget("{id}")] public actionresult<string> get(int id) { return $"value:{id}"; } // post api/values [httppost] public actionresult<string> post(dynamic obj) { return $"姓名:{obj.name},年龄:{obj.age}"; } }
使用.net core创建一个xunit单元测试项目,如图:
项目的模板页已经为我们添加好了xunit的引用,不需要我们手动去nuget导入了,现在从nuget中添加microsoft.aspnetcore.app和microsoft.aspnetcore.testhost,xunit项目并添加webapi的项目引用,如下图所示:
二、编写单元用例
写单元测试一般有三个步骤:arrange,act 和 assert。
新建一个单元测试类:valuestest.cs;用于对valuescontroller进行单元测试。
1、使用httpclient进行get请求测试,单元测试代码如下:
using microsoft.aspnetcore; using microsoft.aspnetcore.hosting; using microsoft.aspnetcore.testhost; using newtonsoft.json; using system.net; using system.net.http; using system.net.mime; using system.text; using system.threading.tasks; using xunit; using xunit.abstractions; namespace webapi.xunit { public class valuestests { public valuestests(itestoutputhelper outputhelper) { var server = new testserver(webhost.createdefaultbuilder() .usestartup<startup>()); client = server.createclient(); } public httpclient client { get; } [fact] public async task getbyid_shouldbe_ok() { // arrange var id = 1; // act var response = await client.getasync($"/api/values/{id}"); // assert assert.equal(httpstatuscode.ok, response.statuscode); } } }
这里我们通过 testserver 拿到一个 httpclient 对象,用它我们可以模拟 http 请求。我们写了一个非常简单的测试用例,完整演示了单元测试的 arrange,act 和 assert 三个步骤。
2、使用httpclient进行post请求测试,并用itestoutputhelper输出请求信息,单元测试代码如下:
using microsoft.aspnetcore; using microsoft.aspnetcore.hosting; using microsoft.aspnetcore.testhost; using newtonsoft.json; using system.net; using system.net.http; using system.net.mime; using system.text; using system.threading.tasks; using xunit; using xunit.abstractions; namespace webapi.xunit { public class valuestests { public valuestests(itestoutputhelper outputhelper) { var server = new testserver(webhost.createdefaultbuilder() .usestartup<startup>()); client = server.createclient(); output = outputhelper; } public httpclient client { get; } public itestoutputhelper output { get; } [fact] public async task post_shouldbe_ok() { var content = new stringcontent(jsonconvert.serializeobject(new { name = "cxt", age = 22 }), encoding.utf8, mediatypenames.application.json); var response = await client.postasync("/api/values", content); // output var responsetest = await response.content.readasstringasync(); output.writeline(responsetest); assert.equal(httpstatuscode.ok, response.statuscode); } } }
3、运行测试用例,得到测试结果。
在当前的方法内,如getbyid_shouldbe_ok()、post_shouldbe_ok()代码块内右键->运行测试,或者打开测试资源管理器,运行所选测试
绿色的勾表示已经测试通过。
下面查看post请求的output打印结果:
通过上面两个测试用例,发现使用起来超级方便。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Net Core Web Api项目与在NginX下发布的方法
asp.net core3.1 引用的元包dll版本兼容性问题解决方案
IdentityServer4实现.Net Core API接口权限认证(快速入门)
ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现
网友评论