跳過到頁腳內容
.NET幫助

AutoFixture C#(對開發者如何理解的工作)

AutoFixture 是一個開源的.NET 函式庫,旨在減少單元測試撰寫中的"安排(Arrange)"階段,進而改善測試管理。 其主要目標是讓開發者專注於測試的內容,而非設置過程,通過讓您使用測試資料創建物件圖。 本文探討如何使用 AutoFixture 通過有效的測試資料生成來促進測試驅動開發。

AutoFixture 是 C# 中一個強大的函式庫,旨在簡化為單元測試創建測試資料的過程。 它幫助開發者避免撰寫重複的設置代碼,通過自動生成測試案例所需的資料。 在單元測試中,AutoFixture 提供了一種簡化的方式來生成測試資料,確保每個單元測試的執行都有多樣且真實的輸入值。 AutoFixture 通過自動生成測試資料,使 C# 測試更加高效,減少了人工設置的需求。

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

安裝和設置 AutoFixture

AutoFixture 可作為一個 NuGet 套件使用,並可通過 NuGet 套件管理器控制台或 Visual Studio 的 NuGet 套件管理器 UI 中的 .NET 添加套件進行安裝。

Install-Package AutoFixture

NuGet 會下載並安裝最新版本的 AutoFixture 及其相依程式庫到您的專案中。

示例:為類創建測試資料

假設我們有一個簡單的員工類,具有例如 LastNameAge 等屬性。 我們可以利用 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}";
}
$vbLabelText   $csharpLabel

代碼描述

Employee 封裝了員工的基本詳細資料,包括其名字、姓氏和年齡,這些都是通過屬性 LastNameAge 來表示的。 其建構函式透過接受這些詳細資料作為參數並將其指定給相應屬性,方便了員工物件的實例化。 此外,GetFullName 方法將員工的名字和姓氏聯結起來,並以字串形式返回全名。

為我們的測試場景設置代碼

接下來,我們將創建一個測試類來測試 Employee 類:

using AutoFixture;

public class EmployeeTests
{
    private readonly IFixture _fixture;

    public EmployeeTests()
    {
        // Using AutoFixture's Fixture to create test data
        _fixture = new Fixture();
    }
}
using AutoFixture;

public class EmployeeTests
{
    private readonly IFixture _fixture;

    public EmployeeTests()
    {
        // Using AutoFixture's Fixture to create test data
        _fixture = new Fixture();
    }
}
$vbLabelText   $csharpLabel

代碼描述

此代碼片段將 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);
}
$vbLabelText   $csharpLabel

代碼描述

測試方法 Employee_ShouldHaveValidValues 驗證 Employee 類是否正確初始其屬性值。 使用測試夾具為 LastNameAge 生成隨機資料,該測試創建 Employee 實例。 然後,它斷言 LastNameAge 屬性是否與 Employee 物件中的生成值匹配,確保建構函式準確地設定了這些屬性。

示例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);
}
$vbLabelText   $csharpLabel

代碼描述

此測試方法包含的測試斷言驗證 Employee 物件的屬性是否與隨機生成的值相符。 它檢查 string 類型屬性 FirstNameLastName,以及 int Age 是否正確設置且有效。 任何失敗的斷言將表示期望值與為員工資訊所生成的隨機值不匹配。

AutoFixture C# (對開發者的運作方式):圖2 - 有效的員工資料單元測試

介紹 IronPDF

IronPDF C# PDF 函式庫 是由 Iron Software 開發的一個強大的 C# PDF 函式庫,便於 閱讀 PDF 文字使用 HTML 創建 PDF 文件。 這個多功能工具使易於格式化的文件能全面附帶樣式資訊地轉換成高品質的 PDF。 使用 IronPDF,將 HTML 文字從 URL 提取並轉換成結構良好的 PDF 文件是一個流暢的過程。 這種能力使 IronPDF 成為開發者自動化和簡化從網頁內容直接創建專業 PDF 文件的重要工具。

AutoFixture C# (對開發者的運作方式):圖3 - IronPDF

安裝 IronPDF

打開 NuGet 套件管理器控制台,並執行以下命令:

Install-Package IronPdf

示例:使用 AutoFixture 功能與 IronPDF

以下是一個示例,展示如何使用 AutoFixture 與 IronPDF 一起生成員工資料的 PDF:

using DemoAutofixture;
using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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);
            Console.WriteLine("PDF Created Successfully!");
        }
        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;
using IronPdf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

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);
            Console.WriteLine("PDF Created Successfully!");
        }
        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();
    }
}
$vbLabelText   $csharpLabel

要使用這個類,您需要實例化 EmployeePdfGenerator,生成一個員工列表,然後調用 GeneratePdf

List<Employee> employees = new()
{
    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");
List<Employee> employees = new()
{
    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");
$vbLabelText   $csharpLabel

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 轉換。 同時,XUnit 測試類 EmployeePdfGeneratorTests 通過嚴格測試來確保 PDF 生成的正確功能。 這種整合的方法簡化了員工資料的生成和文檔化,確保在生成 PDF 的過程中具有穩健性和可靠性。

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.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));
    }
}
$vbLabelText   $csharpLabel

EmployeePdfGeneratorTests 類包含一個測試案例,驗證了在指定文件路徑處 PDF 文件的創建,確保 GeneratePdf 方法正確運作。

AutoFixture C# (對開發者的運作方式):圖5 - AutoFixture C#

結論

AutoFixture 簡化了 .NET 中編寫單元測試的"安排(Arrange)"階段,為開發者提供了一種專注於測試案例而非設置複雜性的手段。 它簡化了單元測試過程,通過自動生成測試資料確保了各種變異且真實的輸入。 與 IronPDF 授權資訊 結合使用,它為持續使用和支持提供了強大的組合。

常見問題解答

如何在 C# 中使用 AutoFixture 生成測試數據?

您可以通過使用 AutoFixture 的 'Fixture' 類來在 C# 中生成測試數據。這個類允許您自動創建帶有隨機數據的類實例,可以有效地設置各種測試場景。

AutoFixture 在 .NET 專案中的安裝步驟是什麼?

要在 .NET 專案中安裝 AutoFixture,您可以使用 NuGet 套件管理控制台並輸入命令 Install-Package AutoFixture。也可以通過 Visual Studio 的 NuGet 套件管理 UI 搜索並添加 AutoFixture 到您的專案中。

AutoFixture 如何改善單元測試過程?

AutoFixture 通過自動生成真實且多樣化的測試數據來增強單元測試過程。這減少了手動設置的需求,確保用於寬泛的輸入範圍進行測試,從而提高了測試覆蓋率和可靠性。

AutoFixture 能否與 .NET 中的 PDF 生成庫集成?

是的,AutoFixture 可以與像 IronPDF 這樣的 .NET 中的 PDF 生成庫集成。通過使用 AutoFixture 生成數據,您可以創建包含動態內容的 PDF,如員工數據,並利用 IronPDF 的功能將 HTML 轉換為 PDF。

AutoFixture 中 'Fixture' 類的目的是什麼?

'Fixture' 類設計用來簡化測試設置,通過自動創建測試數據。它生成帶有隨機數據的類實例,讓開發者更多地專注於測試邏輯,而不是手動設置數據。

AutoFixture 如何促進測試驅動開發 (TDD)?

AutoFixture 通過提供生成測試數據的簡便方法來輔助測試驅動開發 (TDD),讓開發者可以在不花費大量時間設置數據的情況下撰寫測試和實現功能。這簡化了 TDD 過程,使其更為高效。

如何在 C# 中使用 AutoFixture 和 PDF 庫自動化文檔創建?

您可以通過結合 AutoFixture 和一個像 IronPDF 的 PDF 庫來在 C# 中自動化文檔創建。AutoFixture 可以生成文檔所需的數據,而 IronPDF 可以將這些格式為 HTML 的數據高效地轉換為 PDF 文檔。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me