本文使用xUnit對ASP.NET Core WebAPI做單元測試,使用HttpClient的同步和非同步請求,下麵詳細介紹xUnit的使用過程: 一、創建示例項目 模板為我們自動創建了一個ValuesController控制器,保留裡面的一個Get請求和Post請求方法,代碼如下: 使用.NET ...
本文使用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。
- 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列印結果:
通過上面兩個測試用例,發現使用起來超級方便。