【C#/.NET】xUnit和Moq實現TDD

2023-06-15 15:01:14

 目錄

 

前置條件

Moq

xUnit

TDD

實踐

建立專案

紅燈

綠燈

重構

單元測試一些最佳實踐

總結


 

前置條件

Moq

安裝Moq包

Install-Package Moq

 

        Moq是一個Mocking庫,通過它可以輕易地模擬物件來進行測試。在我們的例子中,我們將使用Moq來模擬一個計算器計算介面。

 

xUnit

        xUnit是一個基於.NET平臺的測試框架。它提供了各種測試機制,例如類、測試函數、斷言等等。在我們的例子中,我們將使用xUnit來編寫C#程式碼的測試用例。

 

TDD

        測試驅動開發 (TDD) 是一種軟體開發過程或方法,開發人員基本上通過單元測試開始建立軟體——與傳統方法不同,傳統方法是開發軟體,最後才建立測試用例以確保成功實施.

TDD的三個步驟是紅綠重構

  • 紅燈指的是先編寫單元測試,此時還沒有寫任何具體實現程式碼,所以單元測試編譯都通不過。
  • 綠燈指根據編寫的單元測試,實現程式碼,目標是剛好可以讓測試通過。
  • 重構是指的在保證了實現的程式碼可以通過單元測試,有了單元測試的保障之後,重構程式碼。重複上述的三個紅綠重構步驟。

 

實踐

建立專案

dotnet new sln -n Tdd

dotnet new console -o src/Calculator

dotnet new xunit -o test/Calculator.Tests

dotnet sln add src/Calculator

dotnet sln add test/Calculator.Tests

 

紅燈

        由於TDD是測試先行,此次我們模擬開發一個簡單的計算器。所以先寫單元測試。

using Moq;

namespace Calculator.Tests;

public class CalculatorTests
{
    [Fact]
    public void Calculate_WhenCalled_ReturnsNumber()
    {
        Mock<ICalculator> calculatorMock = new();
        var num1 = It.IsAny<int>();
        var num2 = It.IsAny<int>();
        var res = It.IsAny<int>();
        calculatorMock.Setup(c => c.Calculate(num1, num2)).Returns(res);

        var result = calculatorMock.Object.Calculate(num1, num2);

        Assert.Equal(res, result);
    }
}

 

        測試方法先準備了三個引數,使用了Moq的It.IsAny<>()方法,這個方法可以方便的建立一個物件。然後是Mock<>泛型方法用來模擬介面,通過Setup設定模擬的介面的引數傳什麼,返回什麼結果。

        最後存取了calculatorMock物件的Object,相當於是模擬的ICalculator物件。

        單元測試編寫完之後,是一片紅,無法編譯的。因為目前沒有具體實現程式碼。所以我們完成了TDD的第一步,紅燈。

綠燈

        TDD的第二步,綠燈,我們需要根據現有的單元測試,實現程式碼。讓單元測試能夠通過。

首先是定義一個ICalculator介面,還有Calculate方法

namespace Calculator;

public interface ICalculator
{
    int Calculate(int num1, int num2);
}

 

        執行單元測試,發現可以通過。此時已經完成了第二步,綠燈。

重構

        由於本文只是介紹TDD,不涉及複雜的邏輯。重構環節根據具體的業務邏輯實現就好了。

 

單元測試一些最佳實踐

  • 命名遵循  測試方法名_測試方案_預期行為
  • 測試程式碼避免邏輯,如if,while,for和switch
  • 避免將Mock物件當作欄位在整個單元測試方法都依賴,因為這樣可能對具體一個Mock物件有狀態依賴

 

總結

        在本文中,我們介紹瞭如何使用xUnit和Moq庫實現TDD。通過編寫測試程式碼並在功能程式碼之前執行它,我們能夠快速發現程式中的錯誤,並提高程式碼質量。xUnit提供了各種測試機制,如類、測試函數、斷言等,Moq庫提供了輕鬆模擬物件的機制。如果您正在尋找一個快速、簡單、可靠的開發方法來編寫高質量的程式碼,請嘗試TDD。