使用 xUnit 编写 ASP.NET Core WebAPI单元测试
本文使用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打印结果: ? ?通过上面两个测试用例,发现使用起来超级方便。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – ASP.NET MVC(和MvcContrib)的隐藏功能
- asp.net – Reference.svcmap:无法加载文件或程序集Micros
- 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持
- asp.net-core – 访问Raw Request Body
- 什么时候应该在ASP.NET控件中使用#和=
- 给 asp.net core 写个中间件来记录接口耗时
- asp.net – Automapper ninject依赖项
- asp.net – 如何加密web.config中的一个条目
- asp.net – 是否可以为MaskedEditExtender设置掩码,以便在任
- asp.net – 实体框架:Singletonish ObjectContext – Good
- asp.net-mvc-3 – MvcSiteMapProvider和web.conf
- asp.net-mvc – ASP.NET MVC是否需要安装在我的生
- .Net Linq与Lambda表达式中GroupBy以多个字段分组
- asp.net – 缓存viewstate?
- asp.net – 如何在Entity框架中添加表?
- 版本化ASP.NET Web应用程序
- asp.net-mvc-3 – 在图表.net mvc3中设置间隔
- asp.net – 在Response.End之前使用Response.Flu
- asp.net-mvc – ASP.NET MVC角色授权
- asp.net – 使用外部CSS文件的用户控件