跳過到頁腳內容
.NET幫助

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

AutoFixture 是適用於 .NET 的開放源碼函式庫,目的在於最小化單元測試撰寫中的"安排"階段,進而改善測試管理。 其主要目的是讓開發人員能夠專注於他們正在測試的內容,而非設定過程,方法是讓您使用測試資料建立物件圖形。 本文將探討 AutoFixture 如何透過有效率的測試資料產生,來促進測試驅動的開發。

AutoFixture 是 C# 中一個功能強大的函式庫,旨在簡化為單元測試建立測試資料的流程。 它透過自動產生測試案例的資料,協助開發人員避免撰寫重複的設定程式碼。 在單元測試中,AutoFixture 提供了簡化的方式來產生測試資料,確保每個單元測試都能在多樣且真實的輸入下執行。 AutoFixture 可自動產生測試資料,減少手動設定的需求,讓 C# 測試更有效率。

AutoFixture C# (How It Works For Developers):圖 1 - AutoFixture

安裝與設定 AutoFixture

AutoFixture 以 NuGet 套件的形式提供,可使用 NuGet Package Manager Console 或 Visual Studio 的 NuGet Package Manager UI 中的 .NET add 套件進行安裝。

Install-Package AutoFixture

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

為類建立測試資料的範例

假設我們有一個簡單的員工類,具有以下屬性:FirstNameLastNameAge。 與其在單元測試中手動建立這個類別的實體,我們可以利用 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}";
}
Public Class Employee
	Public Property FirstName() As String
	Public Property LastName() As String
	Public Property Age() As Integer

	Public Sub New(ByVal firstName As String, ByVal lastName As String, ByVal age As Integer)
		Me.FirstName = firstName
		Me.LastName = lastName
		Me.Age = age
	End Sub

	Public Function GetFullName() As String
		Return $"{FirstName} {LastName}"
	End Function
End Class
$vbLabelText   $csharpLabel

程式碼描述

Employee 類別封裝了員工的基本詳細信息,包括他們的名字、姓氏和年齡,分別由屬性 FirstNameLastNameAge 表示。 其建構器會接受這些詳細資訊作為參數,並將其指定給相關的屬性,以利於員工物件的實體化。 此外,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();
    }
}
Imports AutoFixture

Public Class EmployeeTests
	Private ReadOnly _fixture As IFixture

	Public Sub New()
		' Using AutoFixture's Fixture to create test data
		_fixture = New Fixture()
	End Sub
End Class
$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);
}
<Fact>
Public Sub Employee_ShouldHaveValidValues()
	' Arrange
	Dim firstName = _fixture.Create(Of String)()
	Dim lastName = _fixture.Create(Of String)()
	Dim age = _fixture.Create(Of Integer)()

	' Act
	Dim employee As New Employee(firstName, lastName, age)

	' Assert
	Assert.Equal(firstName, employee.FirstName)
	Assert.Equal(lastName, employee.LastName)
	Assert.Equal(age, employee.Age)
End Sub
$vbLabelText   $csharpLabel

程式碼描述

測試方法 Employee_ShouldHaveValidValues 驗證 Employee 類別是否使用提供的值正確初始化其屬性。 使用測試夾具為 FirstNameLastNameAge 產生隨機數據,該測試創建了 Employee 實例。 然後,它斷言 FirstNameLastNameAge 物件的屬性與產生的值匹配,從而確保建構函數準確地設定這些屬性。

範例 2:當啟用建構器時驗證 Employee

[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);
}
<Fact>
Public Sub CreateEmployee_ValidData_ReturnsEmployeeObject()
	' Arrange
	Dim employee = _fixture.Create(Of Employee)()

	' Act 
	' Assert
	Assert.NotNull(employee)
	Assert.False(String.IsNullOrEmpty(employee.FirstName))
	Assert.NotNull(employee.LastName)
	Assert.True(employee.Age > 0)
End Sub
$vbLabelText   $csharpLabel

程式碼描述

此測試方法包含測試斷言,用於驗證 Employee 物件的屬性是否與隨機產生的值相符。 它驗證 string 類型屬性 FirstNameLastName,以及 int Age 是否已正確設定且有效。 任何失敗的斷言都表示為員工詳細資料所產生的預期值與隨機值不匹配。

AutoFixture C# (How It Works For Developers):圖 2 - 有效的員工資料單元測試

介紹 IronPDF。

IronPDF C# PDF Library 是 Iron Software 開發的強大 C# PDF 函式庫,可方便 PDF 文字的讀取使用 HTML 建立 PDF 文件。 此多功能工具可將包含樣式資訊的簡易格式化文件轉換為高品質的 PDF。 有了 IronPDF,從 HTML 文檔生成 PDF 是一個無縫的過程,使用者可以從 URL 擷取 HTML 內容,並將其轉換成結構良好的 PDF 檔案。 這項功能讓 IronPDF 成為希望直接從網頁內容自動化、簡化專業 PDF 文件製作的開發者必備工具。

AutoFixture C# (How It Works For Developers):圖 3 - IronPDF

安裝 IronPDF。

開啟 NuGet Package Manager 主控台,並執行下列指令:

Install-Package IronPdf

使用 IronPDF 的 AutoFixture 功能的程式碼範例

以下是一個範例,展示如何在 IronPDF 旁邊使用 AutoFixture 來產生 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();
    }
}
Imports DemoAutofixture
Imports IronPdf
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text

Public Class EmployeePdfGenerator
	Private ReadOnly _fixture As Fixture

	Public Sub New()
		_fixture = New Fixture()
	End Sub

	Public Function GenerateEmployees(ByVal count As Integer) As List(Of Employee)
		Return _fixture.CreateMany(Of Employee)(count).ToList()
	End Function

	Public Sub GeneratePdf(ByVal employees As List(Of Employee), ByVal filePath As String)
		IronPdf.License.LicenseKey = "Your-License-Key-Here"
		Dim renderer = New ChromePdfRenderer()
		Dim htmlContent As String = GenerateHtml(employees)

		Try
			renderer.RenderHtmlAsPdf(htmlContent).SaveAs(filePath)
			Console.WriteLine("PDF Created Successfully!")
		Catch ex As Exception
			Console.WriteLine($"Error generating PDF: {ex.Message}")
		End Try
	End Sub

	Private Function GenerateHtml(ByVal employees As List(Of Employee)) As String
		Dim htmlBuilder As New StringBuilder()
		htmlBuilder.Append("<!DOCTYPE html><html><head><title>Employee List</title></head><body><h1>Employee List</h1><ul>")

		For Each employee In employees
			htmlBuilder.Append($"<li>{employee.GetFullName()} - Age: {employee.Age}</li>")
		Next employee

		htmlBuilder.Append("</ul></body></html>")
		Return htmlBuilder.ToString()
	End Function
End Class
$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");
Dim employees As New List(Of Employee)() From {
	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)
}

Dim pdfGenerator As New EmployeePdfGenerator()
pdfGenerator.GeneratePdf(employees, "EmployeeList.pdf")
$vbLabelText   $csharpLabel

AutoFixture C# (How It Works For Developers):圖 4 - IronPDF 輸出的 Autofixture

程式碼描述

所提供的 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.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));
    }
}
Imports System.IO
Imports Xunit

Public Class EmployeePdfGeneratorTests
	<Fact>
	Public Sub GeneratePdf_GeneratesPdfFile()
		' Arrange
		Dim generator = New EmployeePdfGenerator()
		Dim employees = generator.GenerateEmployees(5)
		Dim filePath As String = "EmployeeList.pdf"

		' Act
		generator.GeneratePdf(employees, filePath)

		' Assert
		Assert.True(File.Exists(filePath))
	End Sub
End Class
$vbLabelText   $csharpLabel

這裡 EmployeePdfGeneratorTests 類別包含一個測試案例,用於驗證在指定文件路徑創建 PDF 文件,確保 GeneratePdf 方法能夠正確運行。

AutoFixture C# (How It Works For Developers):圖 5 - AutoFixture C#

結論

AutoFixture 簡化了在 .NET 中撰寫單元測試的"安排"階段,提供開發人員專注於測試案例而非複雜設定的方法。 它簡化了單元測試流程,透過自動產生測試資料,確保多樣且真實的輸入。 結合 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技術的創新,同時指導下一代技術領導者。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我