开发者更新

AutoFixture C#(开发者用法)| IronPDF

Jacob Mellor,Team Iron 的首席技术官
Jacob Mellor
Updated: 2026年4月21日

AutoFixture 是一个开源库,旨在为 .NET 最小化单元测试书写中的'安排'阶段,从而改善测试管理。 其主要目的在于使开发者能够专注于他们正在测试的内容,而不是设置过程,通过让您使用测试数据创建对象图。 本文探讨了如何使用 AutoFixture 通过高效的测试数据生成来促进测试驱动开发。

AutoFixture 是 C# 中一个强大的库,旨在简化单元测试的数据创建过程。 它帮助开发人员避免编写重复的设置代码,通过自动生成测试用例的数据。 在单元测试中,AutoFixture 提供了一种生成测试数据的精简方法,确保每个单元测试都能通过多样化且真实的输入来执行。 AutoFixture 通过自动生成测试数据,使 C# 中的测试更加高效,减少手动设置的需求。

AutoFixture C#(开发者工作流程):图1 - AutoFixture

安装和设置 AutoFixture

AutoFixture 可作为 NuGet 包使用,可以通过 NuGet 包管理器控制台或 Visual Studio 的 NuGet 包管理器 UI 中的.NET 添加包进行安装。

PM > Install-Package AutoFixture

NuGet 将下载并安装 AutoFixture 的最新版本及其依赖项到您的项目中。

示例:为类创建测试数据

假设我们有一个简单的员工类,具有诸如FirstName, 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}";
}

代码描述

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

代码描述

此代码片段将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);
}

代码描述

测试方法Employee类能否正确初始化其属性并赋予提供的值。 使用测试工具为FirstName, Employee实例。 然后它断言FirstName, 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);
}

代码描述

此测试方法包含测试断言,以验证Employee对象的属性是否与随机生成的值匹配。 它检查int Age是否正确设置并有效。 任何失败的断言都会表示预期值与为员工详细信息生成的随机值之间的差异。

AutoFixture C#(开发者工作流程):图2 - 有效员工数据单元测试

IronPDF 简介

IronPDF C# PDF Library 是由 Iron Software 开发的强大 C# PDF 库,便于 读取 PDF 文本 和 使用 HTML 创建 PDF 文档。 这种多功能工具能够将易于格式化的文档(包括样式信息)转换为高质量的 PDF。 使用 IronPDF,从 HTML 文本生成 PDFs 是一个无缝过程,允许用户从 URL 中提取 HTML 内容,并将其转换为结构良好的 PDF 文件。 这一功能使得 IronPDF 成为开发人员希望直接从 Web 内容自动化和简化创建专业 PDF 文档的必备工具。

AutoFixture C#(开发者工作流程):图3 - IronPDF

安装 IronPDF

打开 NuGet 包管理器控制台,并运行以下命令:

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

要使用此类,您需要实例化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");

AutoFixture C#(开发者工作流程):图4 - IronPDF输出的AutoFixture

代码描述

提供的 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));
    }
}

这里GeneratePdf方法的正确性。

AutoFixture C#(开发者工作流程):图5 - AutoFixture C#

结论

AutoFixture 简化了 .NET 中单元测试书写的'安排'阶段,为开发人员提供了一种专注于测试用例而不是设置细节的方法。 它简化了单元测试过程,通过自动生成测试数据确保多样化且真实的输入。 结合IronPDF 授权信息,提供了一个用于持续使用和支持的强大组合。

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

相关文章