.NET 幫助

AutoFixture C#(開發人員的工作方式)

發佈 2024年8月13日
分享:

AutoFixture 是一個開源庫用於 .NET 旨在減少單元測試編寫中的「安排」階段,從而改進測試管理。其主要目的是讓開發人員專注於他們正在測試的內容,而不是設置過程,通過允許您使用測試數據創建對象圖。本文章探討如何通過有效的測試數據生成使用AutoFixture來促進測試驅動開發。

介紹

AutoFixture 是 C# 中一個功能強大的庫,旨在簡化為單元測試創建測試數據的過程。它幫助開發者避免編寫重複的設置代碼,通過自動生成測試用例的數據。在單元測試中,AutoFixture 提供了一種簡化的方法來生成測試數據,確保每個單元測試都使用不同且真實的輸入來執行。 AutoFixture 通過自動生成測試數據,使 C# 中的測試更加高效,減少了手動設置的需求。

AutoFixture C# (對開發人員的運作方式): 圖1 - AutoFixture

安裝與設置 AutoFixture

AutoFixture 可作為 NuGet 套件進行安裝。這可以使用 NuGet 套件管理器控制台或 Visual Studio 的 NuGet 套件管理器 UI 的 .NET 「add package」功能來完成。

Install-Package AutoFixture
Install-Package AutoFixture
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

NuGet 會下載並安裝 AutoFixture 及其相依性項目的最新版本到您的專案中。

範例為類別創建測試資料

假設我們有一個簡單的員工裝置實例類別,具有像 FirstName、LastName 和 Age 這樣的屬性。與其在單元測試中手動創建這個新裝置類別的實例,我們可以利用 AutoFixture 為我們生成隨機數據。

public class Employee
  {
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public int Age { get; set; }
      public Employee(string firstName, string lastName, int age)
      {
          FirstName = firstName;
          LastName = lastName;
          Age = age;
      }
      public string GetFullName() => $"{FirstName} {LastName}";
  }
public class Employee
  {
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public int Age { get; set; }
      public Employee(string firstName, string lastName, int age)
      {
          FirstName = firstName;
          LastName = lastName;
          Age = age;
      }
      public string GetFullName() => $"{FirstName} {LastName}";
  }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

程式碼描述

現在,Employee 類別封裝了員工的重要細節,包括他們的名字、姓氏和年齡,這些分別由 FirstName、LastName 和 Age 屬性表示。透過這些細節作為參數並將它們賦值給相應的屬性,它的建構函數可以實例化一個員工對象。此外,GetFullName 方法將員工的名字和姓氏連接在一起,返回一個字串形式的全名。

設置我們測試場景的代碼

接下來,我們將創建代碼進行測試:

using AutoFixture;
public class EmployeeTests
{
    private readonly IFixture _fixture;
    public EmployeeTests()
    {
        _fixture = new Fixture(); // var fixture
    }
}
using AutoFixture;
public class EmployeeTests
{
    private readonly IFixture _fixture;
    public EmployeeTests()
    {
        _fixture = new Fixture(); // var fixture
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

代碼描述

這段代碼片段將 AutoFixture 整合到 Employee 類的單元測試中。通過導入 AutoFixture 命名空間,開發者可以訪問數據生成功能。在構造函數中初始化 Fixture 新實例的 _fixture 字段,簡化了測試數據創建。此設置提高了測試效率和可靠性,從而全面覆蓋 Employee 類。

範例1:驗證員工測試案例對象值

[Fact]
    public void Employee_ShouldHaveValidValues()
    {
        // Arrange
        var firstName = _fixture.Create<string>();
        var lastName = _fixture.Create<string>();
        var age = _fixture.Create<int>();
        // Act
        var employee = new Employee(firstName, lastName, age);
        // Assert
        Assert.Equal(firstName, employee.FirstName);
        Assert.Equal(lastName, employee.LastName);
        Assert.Equal(age, employee.Age);
    }
[Fact]
    public void Employee_ShouldHaveValidValues()
    {
        // Arrange
        var firstName = _fixture.Create<string>();
        var lastName = _fixture.Create<string>();
        var age = _fixture.Create<int>();
        // Act
        var employee = new Employee(firstName, lastName, age);
        // Assert
        Assert.Equal(firstName, employee.FirstName);
        Assert.Equal(lastName, employee.LastName);
        Assert.Equal(age, employee.Age);
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

代碼描述

測試方法 Employee_ShouldHaveValidValues 驗證 Employee 類別是否正確初始化其屬性。使用測試設備生成隨機數據來設置 firstname、lastname 和 age,該測試創建一個 Employee 實例。然後,斷言 Employee 對象的 FirstName、LastName 和 Age 屬性與生成的值匹配,確保構造函數準確設置這些屬性。

範例 2:在調用構造函數時驗證員工

[Fact]
        public void CreateEmployee_ValidData_ReturnsEmployeeObject()
        {
            // Arrange
            var employee = _fixture.Create<Employee>();
            // Act 
            // Assert
            Assert.NotNull(employee);
            Assert.False(string.IsNullOrEmpty(employee.FirstName));
            Assert.NotNull(employee.LastName);
            Assert.True(employee.Age > 0);
        }
[Fact]
        public void CreateEmployee_ValidData_ReturnsEmployeeObject()
        {
            // Arrange
            var employee = _fixture.Create<Employee>();
            // Act 
            // Assert
            Assert.NotNull(employee);
            Assert.False(string.IsNullOrEmpty(employee.FirstName));
            Assert.NotNull(employee.LastName);
            Assert.True(employee.Age > 0);
        }
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

代碼說明

這段測試代碼片段包括測試斷言,用於驗證 Employee 對象的屬性是否與隨機生成的值匹配。它確認 string 類型屬性的 string FirstName、string LastName 和 int Age 屬性是否與分配給 firstName、lastName 和 age 變量的隨機生成的值一致。任何失敗的斷言都表示期望的員工詳細信息與隨機生成的值之間存在不匹配。

AutoFixture C#(適用於開發人員的運作方式):圖 2 - 有效的員工數據單元測試

介紹 IronPDF

IronPDF 是一個強大的 C# PDF 函式庫,由 開發 Iron Software 這有助於 讀取創建 的PDF文件。這個多功能工具可以將易於格式化的文檔,連同樣式訊息,一併轉換成高品質的PDF文件。使用IronPDF, 生成PDF檔案 從 HTML 文本轉換是一個無縫的過程,允許用戶從 URL 提取 HTML 內容並將其轉換為結構良好的 PDF 文件。這項功能使 IronPDF 成為開發人員自動化和簡化直接從網頁內容創建專業 PDF 文件的重要工具。

AutoFixture C#(開發者如何使用):圖3 - IronPDF

安裝 IronPDF

打開 NuGet 程式包管理控制台,並執行以下命令:

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
VB   C#

使用Autofixture與IronPDF功能的代碼範例

我們將首先建立一個EmployeePdfGenerator類別,其中包含生成員工的方法。

using DemoAutofixture;
List<Employee> employees = new List<Employee>()
{
    new Employee("John","Smith",32){ },
    new Employee("Emily","Davis",18){ },
    new Employee("David","Brown",24){ },
    new Employee("Jane","Doe",16){ },
    new Employee("Michael","Johnson",49){ },
};
EmployeePdfGenerator pdfGenerator = new();
pdfGenerator.GeneratePdf(employees, "EmployeeList.pdf");
Console.WriteLine("PDF Created Successfully!");
public class EmployeePdfGenerator
{
    private readonly Fixture _fixture;
    public EmployeePdfGenerator()
    {
        _fixture = new Fixture();
    }
    public List<Employee> GenerateEmployees(int count)
    {
        return _fixture.CreateMany<Employee>(count).ToList();
    }
    public void GeneratePdf(List<Employee> employees, string filePath)
    {
     IronPdf.License.LicenseKey = "Your-License-Key-Here";
        var renderer = new ChromePdfRenderer();
        string htmlContent = GenerateHtml(employees);
        try
        {
            renderer.RenderHtmlAsPdf(htmlContent).SaveAs(filePath);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
        }
    }
    private string GenerateHtml(List<Employee> employees)
    {
        StringBuilder htmlBuilder = new StringBuilder();
        htmlBuilder.Append("<!DOCTYPE html><html><head><title>Employee List</title></head><body><h1>Employee List</h1><ul>");
        foreach (var employee in employees)
        {
            htmlBuilder.Append($"<li>{employee.GetFullName()} - Age: {employee.Age}</li>");
        }
        htmlBuilder.Append("</ul></body></html>");
        return htmlBuilder.ToString();
    }
}
using DemoAutofixture;
List<Employee> employees = new List<Employee>()
{
    new Employee("John","Smith",32){ },
    new Employee("Emily","Davis",18){ },
    new Employee("David","Brown",24){ },
    new Employee("Jane","Doe",16){ },
    new Employee("Michael","Johnson",49){ },
};
EmployeePdfGenerator pdfGenerator = new();
pdfGenerator.GeneratePdf(employees, "EmployeeList.pdf");
Console.WriteLine("PDF Created Successfully!");
public class EmployeePdfGenerator
{
    private readonly Fixture _fixture;
    public EmployeePdfGenerator()
    {
        _fixture = new Fixture();
    }
    public List<Employee> GenerateEmployees(int count)
    {
        return _fixture.CreateMany<Employee>(count).ToList();
    }
    public void GeneratePdf(List<Employee> employees, string filePath)
    {
     IronPdf.License.LicenseKey = "Your-License-Key-Here";
        var renderer = new ChromePdfRenderer();
        string htmlContent = GenerateHtml(employees);
        try
        {
            renderer.RenderHtmlAsPdf(htmlContent).SaveAs(filePath);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
        }
    }
    private string GenerateHtml(List<Employee> employees)
    {
        StringBuilder htmlBuilder = new StringBuilder();
        htmlBuilder.Append("<!DOCTYPE html><html><head><title>Employee List</title></head><body><h1>Employee List</h1><ul>");
        foreach (var employee in employees)
        {
            htmlBuilder.Append($"<li>{employee.GetFullName()} - Age: {employee.Age}</li>");
        }
        htmlBuilder.Append("</ul></body></html>");
        return htmlBuilder.ToString();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

AutoFixture C#(它對開發者的作用):圖 4 - 使用 AutoFixture 與 IronPDF 的輸出

代碼說明

所提供的 C# 代碼利用 IronPDF 庫生成列出員工及其年齡的 PDF 文檔。它定義了一個 EmployeePdfGenerator 類並包含 GeneratePdf 方法,該方法接受一個 Employee 對象列表和一個文件路徑。在內部,通過 GenerateHtml 方法構造 HTML 內容,然後使用 IronPDF 的 HtmlToPdf 類將此 HTML 渲染為 PDF,並保存在指定的文件路徑。改進包括使用 StringBuilder 來生成 HTML 並為 PDF 生成和文件保存添加基本的錯誤處理。

編寫測試方法

在以下設定中,使用AutoFixture創建Employee類的實例,從而生成隨機數據進行測試。IronPDF被用來無縫地將包括員工信息在內的HTML內容轉換成PDF格式。EmployeePdfGenerator類協調這些過程,有效地管理數據生成和PDF轉換。同時,EmployeePdfGeneratorTests XUnit測試類通過嚴格的測試確保PDF生成的正常功能。這種綜合方法簡化了員工數據的生成和文檔化,確保PDF生成過程中的健壯性和可靠性。

using System;
using System.IO;
using Xunit; 
public class EmployeePdfGeneratorTests
{
    [Fact]
    public void GeneratePdf_GeneratesPdfFile()
    {
        // Arrange
        var generator = new EmployeePdfGenerator();
        var employees = generator.GenerateEmployees(5);
        string filePath = "EmployeeList.pdf";
        // Act
        generator.GeneratePdf(employees, filePath);
        // Assert
        Assert.True(File.Exists(filePath));
    }
}
using System;
using System.IO;
using Xunit; 
public class EmployeePdfGeneratorTests
{
    [Fact]
    public void GeneratePdf_GeneratesPdfFile()
    {
        // Arrange
        var generator = new EmployeePdfGenerator();
        var employees = generator.GenerateEmployees(5);
        string filePath = "EmployeeList.pdf";
        // Act
        generator.GeneratePdf(employees, filePath);
        // Assert
        Assert.True(File.Exists(filePath));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

在這裡,EmployeePdfGeneratorTests 類包含了針對 Employee 類的測試案例,用於驗證檔案路徑上的 PDF。

AutoFixture C#(開發人員如何使用):圖 5 - AutoFixture C#

結論

AutoFixture 簡化了在 .NET 中編寫單元測試的「安排」階段,為開發人員提供了一種專注於測試用例而非設置細節的方法。它通過自動生成測試數據來精簡單元測試過程,確保多樣化和現實的輸入。與 IronPDF 繼續使用和支援。

< 上一頁
HttpListener C#(它如何為開發人員工作)
下一個 >
Entity Framework Core(它是如何為開發者工作的)

準備開始了嗎? 版本: 2024.10 剛剛發布

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >