
AutoFixture C#(對開發者如何理解的工作)
AutoFixture 是一個開源程式庫,專為.NET設計,旨在最小化單元測試撰寫中的'Arrange'階段,從而改善測試管理。 它的主要目的是讓開發者專注於測試的內容,而非設置過程,藉由讓您建立包含測試資料的物件圖。 本文探討了如何使用AutoFixture來通過高效的測試資料生成促進測試驅動開發。
AutoFixture是一個強大的C#程式庫,旨在簡化單元測試資料的建立過程。 它幫助開發者避免撰寫重複的設置程式碼,通過自動生成測試案例資料來達成。 在單元測試中,AutoFixture提供了一種簡化的生成測試資料的方法,確保每個單元測試以多樣且真實的輸入執行。 AutoFixture透過自動生成測試資料,使得C#的測試效率更高,減少手動設置的需求。

安裝和設置AutoFixture
AutoFixture作為NuGet套件提供,可以透過NuGet包管理控制台或Visual Studio的NuGet包管理UI中的.NET新增套件來安裝。
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 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程式程式碼描述
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();
}
}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程式程式碼描述
此程式碼片段將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 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程式程式碼描述
測試方法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 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程式程式碼描述
此測試方法包括測試斷言,以驗證Employee物件的屬性是否與隨機生成的值匹配。 它驗證int Age是否已正確設置並有效。 任何斷言失敗都表示員工詳細資料的預期值與隨機生成的值不匹配。

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

安裝IronPDF
打開NuGet Package Manager控制台,然後運行以下命令:
使用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();
}
}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若要使用這個類,您需要進行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");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")
程式程式碼描述
提供的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));
}
}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這裡GeneratePdf方法能夠正確運作。

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

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


