跳至頁尾內容
.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的最新版本及其依賴項到您的專案中。

範例:為類別建立測試資料

假設我們有一個簡單的員工類,其屬性如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}";
}
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

程式程式碼描述

Age表示。 其構造函式通過接受這些細節作為參數並賦予相應的屬性,促進了員工物件的實例化。 此外,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實例初始化,簡化了測試資料的建立。 此設置提高了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類是否正確用提供的值初始化其屬性。 使用測試裝置生成Employee實例。 然後,它斷言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);
}
<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物件的屬性是否與隨機生成的值匹配。 它驗證int Age是否已正確設置並有效。 任何斷言失敗都表示員工詳細資料的預期值與隨機生成的值不匹配。

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

介紹IronPDF

IronPDF C# PDF Library 是Iron Software開發的強大C# PDF程式庫,可促進PDF文字的閱讀使用HTML建立PDF文件。 這個多功能工具可以將易於格式化的文件,包含樣式資訊,轉換為高質量的PDF文件。 使用IronPDF,從HTML文字生成PDF變得流暢無阻,允許使用者從URL中擷取HTML內容並將其轉化為結構良好的PDF文件。 這項能力使IronPDF成為開發人員的必備工具,通過自動化和簡化專業PDF文件的建立直接來源於網頁內容。

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

安裝IronPDF

打開NuGet Package Manager控制台,然後運行以下命令:

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();
    }
}
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

若要使用這個類,您需要進行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# (對開發者的作用):圖4 - Autofixture與IronPDF輸出

程式程式碼描述

提供的C#程式碼使用IronPDF程式庫生成一個PDF文件,列出員工及其年齡。 它定義了一個Employee物件列表和文件路徑。 在內部,它透過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

這裡GeneratePdf方法能夠正確運作。

AutoFixture C# (對開發者的作用):圖5 - AutoFixture C#

結論

AutoFixture簡化了.NET中單元測試撰寫的'Arrange'階段,為開發者提供了一種專注於測試案例而非設置細節的方法。 它簡化了單元測試過程,通過自動生成測試資料,確保多樣且真實的輸入。 配合IronPDF許可資訊,它提供了強大的組合,以持續使用和支援。

常見問題

我如何使用 AutoFixture 在 C# 中生成測試資料?

您可以使用 AutoFixture 的 'Fixture' 類別在 C# 中生成測試資料。此類別允許您自動建立類別的實例並帶有隨機資料,可以有效地設置各種測試場景。

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

要在 .NET 專案中安裝 AutoFixture,您可以使用 NuGet 套件管理器控制台,使用命令 Install-Package AutoFixture 。它也可通過 Visual Studio 的 NuGet 套件管理器 UI 獲取,您可以在其中搜尋 AutoFixture 並將其新增到專案中。

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

AutoFixture 通過自動生成實際和多樣化的測試資料來增強單元測試過程。這減少了手動設置的需求,並確保測試在範圍廣泛的輸入下進行,從而提高測試的覆蓋性和可靠性。

AutoFixture 能與 .NET 中的 PDF 生成程式庫整合嗎?

是的,AutoFixture 可以與 .NET 中的 PDF 生成程式庫例如 IronPDF 整合。通過使用 AutoFixture 生成資料,您可以建立包含動態內容的 PDF,如員工資料,利用 IronPDF 將 HTML 轉換為 PDF 的功能。

'Fixture' 類別在 AutoFixture 中的用途是什麼?

AutoFixture 中的 'Fixture' 類別旨在簡化測試設置,通過自動建立測試資料。它生成類別實例與隨機資料,使開發者更專注於測試邏輯,而不是手動設置資料。

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

AutoFixture 透過提供一種簡便方法生成測試資料來幫助測試驅動開發(TDD),讓開發者可以在不花費過多時間進行資料設置的情況下撰寫測試並實現功能。這簡化了 TDD 流程,使其更有效率。

我如何使用 AutoFixture 和 PDF 程式庫在 C# 中自動化文件建立?

您可以將 AutoFixture 和 PDF 程式庫如 IronPDF 結合在 C# 中自動化文件建立。AutoFixture 可以生成文件所需的資料,而 IronPDF 可以高效地將這些資料格式化為 HTML 後轉換為 PDF 文件。

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

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

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