目的

進行單元測試時,可以隔絕依賴的項目。

建立新專案

選擇ASP.NET Core Web API專案範本,並執行下一步 步驟1

設定新的專案

命名你的專案名稱,並選擇專案要存放的位置。 範例2-1

其他資訊

直接進行下一步 步驟3

建立新的類別庫

進行命名時通常會與要測試的專案同名並加上結尾.Tests,以此範例就會變成MoqExample.Tests 範例4-1 範例4-2 範例4-3

NuGet加入套件

針對xUnitExample.Tests加入相關套件

  • xunit
  • xunit.runner.visualstudio
  • Microsoft.NET.Test.Sdk
  • coverlet.collector
  • Moq

範例5-1

針對MoqExample.Tests類別庫加入參考

引用要測試的專案,才能將測試與實際專案切分開來 範例6-1 範例6-2

新增WeatherForecastControllerTests.cs類別檔

刪除預設的類別檔(Class1.cs),並在MoqExample.Tests專案新增對應資料夾,與類別檔並加結尾Tests範例7-1

編輯WeatherForecastControllerTests.cs類別檔

測試都會分三個階段

  • Arrange:準備階段,包含初始化相關資料
  • Act:執行測試方法後所取得的結果
  • Assert:驗證Act取得的結果是否符合預期結果 這次要測試的是controller,有注入Ilogger,如何將Ilogger隔開的關鍵就是使用Moq這個套件 範例8-1
using Microsoft.Extensions.Logging;
using Moq;
using MoqExample.Controllers;
using Xunit;
namespace MoqExample.Tests.Controllers {
  public class WeatherForecastControllerTests {
    [Fact]
    public void Get() {
      //Arrange
      //透過mock將外界的介面包起來
      var MockLogger = new Mock<ILogger<WeatherForecastController>>();
      //當成物件傳入controller,代替實際的介面
      var Controllers = new WeatherForecastController(MockLogger.Object);
      //Act
      //執行要測試的函式
      var Results = Controllers.Get();
      //Assert
      //確認結果不為null
      Assert.NotNull(Results);
      //確認結果數量等於5
      Assert.Equal(5, Results.Count());
    }
  }
}

範例8-2

執行結果

點選測試>執行所有測試

範例9-1 下方視窗就會顯示成功或失敗 範例9-2

參考

Moq-Quickstart

範例檔

GitHub