亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

xUnit 編寫 ASP.NET Core 單元測試的方法

 更新時間:2020年06月09日 16:09:17   作者:Liam Wang  
這篇文章主要介紹了xUnit 編寫 ASP.NET Core 單元測試的方法,文中代碼非常詳細,幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下

還記得 .NET Framework 的 ASP.NET WebForm 嗎?那個年代如果要在 Web 層做單元測試簡直就是災(zāi)難啊。.NET Core 吸取教訓(xùn),在設(shè)計上考慮到了可測試性,就連 ASP.NET Core 這種 Web 或 API 應(yīng)用要做單元測試也是很方便的。其中面向接口和依賴注入在這方面起到了非常重要的作用。

本文就來手把手教你如何用 xUnit 對 ASP.NET Core 應(yīng)用做單元測試。.NET Core 常用的測試工具還有 NUnit 和 MSTest,我本人習(xí)慣用 xUnit 作為測試工具,所以本文用的是 xUnit。

創(chuàng)建示例項目

先用 ASP.NET Core API 模板建一個應(yīng)用。

模板為我們自動創(chuàng)建了一個 ValuesController,為了方便演示,我們只留其中一個 Get 方法:

public class ValuesController : ControllerBase
{
 // GET api/values/5
 [HttpGet("{id}")]
 public ActionResult<string> Get(int id)
 {
  return "value";
 }
}

然后再添加一個 xUnit 單元測試項目:

模板自動為我們添加好了 xUnit 引用:

<ItemGroup>
 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
 <PackageReference Include="xunit" Version="2.4.0" />
 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
</ItemGroup>

但要測試 ASP.NET Core 應(yīng)用還需要添加兩個 NuGet 包:

Install-Package Microsoft.AspNetCore.App

Install-Package Microsoft.AspNetCore.TestHost

當(dāng)然還要引入目標(biāo)項目。最后的引用是這樣的:

<ItemGroup>
 <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.5" />
 <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.1.1" />
 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
 <PackageReference Include="xunit" Version="2.4.0" />
 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
</ItemGroup>

<ItemGroup>
 <ProjectReference Include="..\WebApplication1\WebApplication1.csproj" />
</ItemGroup>

添加完引用后編譯一下,確認引用沒有問題。

編寫單元測試

寫單元測試一般有三個步驟:Arrange,Act 和 Assert。

Arrange 是準(zhǔn)備階段,這個階段是準(zhǔn)備工作,比如模擬數(shù)據(jù)、初始化對象等;

Act 是行為階段,這個階段是用準(zhǔn)備好的數(shù)據(jù)去調(diào)用要測試的方法;

Assert 是斷定階段,就是把調(diào)用目標(biāo)方法返回的值和預(yù)期的值進行比較,如果和預(yù)期一致說明測試通過,否則為失敗。

按照這個步驟我們來編寫一個單元測試方法,以 ValuesController 中的 Get 方法作為要測試的目標(biāo)。一般一個單元測試方法就是一個測試用例。

我們在測試工程添加一個 ValuesTests 單元測試類,然后編寫一個單元測試方法,代碼如下:

public class ValuesTests
{
 public ValuesTests()
 {
  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 三個步驟。

建議單元測試的方法名使用“什么應(yīng)該是什么”的模式。比如上面的 GetById_ShouldBe_Ok,表示調(diào)用 GetById 這個 API 返回的結(jié)果應(yīng)該是 OK 的,這樣一看就知道你這個測試用例是干嗎的,不需要過多的注釋。

運行單元測試

單元測試用例寫好后,打開“Test Explore”(中文版 VS 看到的是中文),在測試方法上右擊,選擇“Run Seleted Tests”,也可以在方法代碼塊內(nèi)鼠標(biāo)右擊選擇“Run Tests”:

注意看測試方法前面圖標(biāo)的顏色,目前是藍色的,表示測試用例還沒有運行過。

測試用例執(zhí)行結(jié)束后如果結(jié)果和預(yù)期一致就是綠色的圖標(biāo):

如果運行結(jié)果和預(yù)期不一致就會是紅色圖標(biāo),然后你需要修改代碼直到出現(xiàn)綠色圖標(biāo)。你可以在“Test Explore”的下方看到執(zhí)行消耗的時間,也可以在 Output 窗口看到執(zhí)行的細節(jié)。

以上圖標(biāo)顏色的變化過程是:藍色,紅色,再綠色,有可能藍色經(jīng)過一次運行就直接變成綠色,也有可能經(jīng)過很多次紅色才變成綠色。測試驅(qū)動開發(fā)中的 BRG(藍紅綠)術(shù)語就是這么來的。

調(diào)試單元測試

你可以通過添加斷點的方式在單元測試中調(diào)試。方法很簡單,在需要調(diào)試的方法上右鍵選擇“Debug Seleted Tests”即可,和平時的調(diào)試是一樣的。

如果我們要查看 API 具體返回了什么,可以通過加斷點調(diào)試來查看返回結(jié)果的變量字符串值,但這種方式不是最好的選擇。比如對于同一個 API,我要看看 10 種參數(shù)返回的結(jié)果是什么樣的,每次都通過斷點調(diào)試來查看就很麻煩。

除了添加斷點來調(diào)試,還有一種打印日志的方法來快速調(diào)試,xUnit 可以很方便地做到這一點。為此我們來修改一ValuesTests:

public ValuesTests(ITestOutputHelper outputHelper)
{
 var server = new TestServer(WebHost.CreateDefaultBuilder()
  .UseStartup<Startup>());
 Client = server.CreateClient();
 Output = outputHelper;
}

public ITestOutputHelper Output{ get; }

// ... (省略其它代碼)

這里我們在構(gòu)造函數(shù)中添加了 ITestOutputHelper 參數(shù),xUnit 會將一個實現(xiàn)此接口的實例注入進來。拿到這個實例后,我們就可以用它來輸出日志了:

[Fact]
public async Task GetById_ShouldBe_Ok()
{
 // Arrange
 var id = 1;

 // Act
 var response = await Client.GetAsync($"/api/values/{id}");

 // Output
 var responseText = await response.Content.ReadAsStringAsync();
 Output.WriteLine(responseText);

 // Assert
 Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}

運行(注意不是 Debug)此方法,運行結(jié)束后,在“Test Explore”的下方可以可以看到“Output”字樣,點擊它就可以看到輸出的結(jié)果,如圖:

通過這種方式,每次運行測試我們就可以很方便的查看輸出結(jié)果了。

其它

上面我們是通過模擬 Http 請求的方式來調(diào)用 API 測試的,還有一種就是 new 一個 Controller 來直接調(diào)用它的 Action 方法來測試。比如這樣:

// Arrange
var id = 1;
var controller = new ValuesController();
// Act
var result = controller.Get(id);

如果 Controller 沒有其它依賴,這種方式當(dāng)然是最方便的。但通常 Controller 是會有一個或多個依賴的,比如這樣:

public class ValuesController : Controller
{
 private readonly ISessionRepository _sessionRepository;

 public ValuesController(ISessionRepository sessionRepository)
 {
  _sessionRepository = sessionRepository;
 }

 // ...
}

我們就要模擬實例化這個 Controller 的所有依賴,當(dāng)然手動模擬是不現(xiàn)實的,因為一個依賴類還可能會依賴其它的類或接口,依賴鏈可能很長,你不可能每個依賴都手動去實例化它們。有一個叫 Moq 的工具可以自動來模擬實例化依賴,它的用法是這樣的:

// ..
// Arrange
var mockRepo = new Mock<ISessionRepository>();
mockRepo.Setup(...);
var controller = new HomeController(mockRepo.Object);

// Act
var result = await controller.Index();

這種方式我是不推薦的,因為拋開 Moq 的學(xué)習(xí)成本不說,重要的是它不如模擬 Http 請求那樣接近真實的調(diào)用場景,所以本文對它不作過多的介紹,大家知道有這么回事就行。

以上就是xUnit 編寫 ASP.NET Core 單元測試的方法的詳細內(nèi)容,更多關(guān)于xUnit 編寫 ASP.NET Core 單元測試的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • .NET單元測試使用AutoFixture按需填充的幾種方式和最佳實踐記錄

    .NET單元測試使用AutoFixture按需填充的幾種方式和最佳實踐記錄

    AutoFixture是一個.NET庫,旨在簡化單元測試中的數(shù)據(jù)設(shè)置過程,通過自動生成測試數(shù)據(jù),它幫助開發(fā)者減少測試代碼的編寫量,使得單元測試更加簡潔、易讀和易維護,本文介紹.NET單元測試使用AutoFixture按需填充的幾種方式和最佳實踐記錄,感興趣的朋友一起看看吧
    2024-07-07
  • .NET命令行解析器示例程序(命令行選項功能)

    .NET命令行解析器示例程序(命令行選項功能)

    經(jīng)常需要開發(fā)一下小工具,之前都是自己解析命令行參數(shù),接觸過動態(tài)語言社區(qū)以后,發(fā)現(xiàn)命令行解析有特定的模式和框架可以利用,本文介紹一個.NET 平臺的類庫CommandLineParser
    2013-11-11
  • ASP.NET MVC在基控制器中處理Session

    ASP.NET MVC在基控制器中處理Session

    這篇文章介紹了ASP.NET MVC在基控制器中處理Session的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 如何輕松搭建Windows8云平臺的開發(fā)環(huán)境

    如何輕松搭建Windows8云平臺的開發(fā)環(huán)境

    Windows Store應(yīng)用是基于Windows 8操作系統(tǒng)的新一代Windows應(yīng)用程序,其開發(fā)平臺以及運行模式和以往傳統(tǒng)平臺略有不同。為了幫助更多開發(fā)人員加入到Windows Store應(yīng)用開發(fā)行列,本篇將介紹如何在Windows Azure云平臺搭建Windows8應(yīng)用開發(fā)環(huán)境,本篇介紹的方法適合未安裝Windows8操作系統(tǒng),使用Mac或者Linux平臺的開發(fā)人員參考閱讀。
    2013-02-02
  • asp.net轉(zhuǎn)出json格式客戶端顯示時間

    asp.net轉(zhuǎn)出json格式客戶端顯示時間

    最近在學(xué)習(xí)ext過程中,很多地方的數(shù)據(jù)從服務(wù)器傳到客戶端都是以json格式傳回來
    2008-10-10
  • 調(diào)試ASP.NET2005/2008時,端口不正確的解決三套方案

    調(diào)試ASP.NET2005/2008時,端口不正確的解決三套方案

    這篇文章主要介紹了調(diào)試ASP.NET2005/2008時,端口不正確的解決三套方案,小編就特別喜歡收藏這類文章,方便以后工作學(xué)習(xí)中遇到這類問題進行解決。
    2015-09-09
  • 如何在ASP.NET Core中使用Session的示例代碼

    如何在ASP.NET Core中使用Session的示例代碼

    這篇文章主要介紹了如何在ASP.NET Core中使用Session的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 服務(wù)端拼接json數(shù)據(jù)格式的正確寫法(Append方式)

    服務(wù)端拼接json數(shù)據(jù)格式的正確寫法(Append方式)

    我們通常會在服務(wù)端拼接json數(shù)據(jù)返回給客戶端,第一種AppendFormat的方式拼接,這種方法是不行的,正確的拼接方式是Append的方式
    2013-07-07
  • 解析Asp.net,C# 純數(shù)字加密解密字符串的應(yīng)用

    解析Asp.net,C# 純數(shù)字加密解密字符串的應(yīng)用

    本篇文章是對Asp.net,C# 純數(shù)字加密解密字符串的應(yīng)用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • asp.net web大文件上傳帶進度條實例代碼

    asp.net web大文件上傳帶進度條實例代碼

    web 大文件上傳 帶進度條
    2008-10-10

最新評論