1. 程式人生 > >使用 xUnit 編寫 ASP.NET Core WebAPI單元測試

使用 xUnit 編寫 ASP.NET Core WebAPI單元測試

mage adas mes 14. 步驟 表示 模板 .text col

本文使用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打印結果:

技術分享圖片

通過上面兩個測試用例,發現使用起來超級方便。

使用 xUnit 編寫 ASP.NET Core WebAPI單元測試