.NET 帮助

AutoFixture C#(开发者如何使用)

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

介绍

AutoFixture 是一个功能强大的 C# 库,旨在简化为单元测试创建测试数据的过程。 它通过自动生成测试用例数据,帮助开发人员避免编写重复的设置代码。 在单元测试中,AutoFixture 提供了一种生成测试数据的简化方法,确保每个单元测试都能在各种真实输入的情况下执行。 AutoFixture 通过自动生成测试数据,减少了手动设置的需要,从而提高了 C# 测试的效率。

AutoFixture C#(开发人员的工作原理):图1 - AutoFixture

安装和设置 AutoFixture

AutoFixture 以 NuGet 软件包的形式提供,可以安装。 可以使用 NuGet 包管理器控制台或 .NET 添加包 Visual Studio 的 NuGet 包管理器用户界面来完成。

Install-Package AutoFixture
Install-Package AutoFixture
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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

为类创建测试数据示例

假设我们有一个简单的雇员夹具实例类,该类具有 FirstName、LastName 和 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}";
  }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

代码描述

现在,雇员类封装了雇员的基本详细信息,包括他们的名字、姓氏和年龄,分别由属性 FirstName、LastName 和 Age 表示。 其构造函数通过接受这些详细信息作为参数并将其赋值给相应的属性,为雇员对象的实例化提供了便利。 此外,GetFullName 方法将雇员的名和姓连接起来,以字符串形式返回全名。

为测试场景设置代码

接下来,我们将创建代码进行测试:

using AutoFixture;
public class EmployeeTests
{
    private readonly IFixture _fixture;
    public EmployeeTests()
    {
        _fixture = new Fixture(); // var fixture
    }
}
using AutoFixture;
public class EmployeeTests
{
    private readonly IFixture _fixture;
    public EmployeeTests()
    {
        _fixture = new Fixture(); // var fixture
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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);
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

代码描述

测试方法 Employee_ShouldHaveValidValues 验证 Employee 类是否使用提供的值正确初始化其属性。 该测试使用测试夹具随机生成姓、名和年龄的数据,并创建一个 Employee 实例。 然后,它断言 Employee 对象的 FirstName、LastName 和 Age 属性与生成的值相匹配,确保构造函数准确设置这些属性。

示例 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);
        }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

代码描述

该测试代码片段包含测试断言,用于验证雇员对象的属性是否与随机生成的值相匹配。 它验证字符串 FirstName、字符串 LastName 和 int Age 属性的字符串类型属性是否与随机生成的分配给 firstName、lastName 和 age 变量的值一致。 任何失败的断言都表明雇员详细信息生成的预期值和随机值不匹配。

AutoFixture C#(它如何为开发人员工作):图 2 - 有效员工数据单元测试

介绍IronPDF

IronPDF C# PDF库 是由Iron Software开发的一个强大的C# PDF库,它可以方便地读取PDF文本使用HTML创建PDF文档。 这款多功能工具可将格式简单的文档转换为高质量的 PDF,并提供样式信息。 使用IronPDF,从HTML生成PDF文本是一个流畅的过程,使用户能够从URL提取HTML内容并将其转换为结构良好的PDF文件。 这一功能使 IronPDF 成为开发人员的必备工具,他们希望直接从网页内容自动化和简化专业 PDF 文档的创建。

AutoFixture C#(开发人员如何使用):图3 - IronPDF

安装 IronPDF

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

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
$vbLabelText   $csharpLabel

使用 IronPdf 的 AutoFixture 功能的代码示例

我们将首先创建一个 EmployeePdfGenerator 类,其中包含生成 Employees 的方法。

using DemoAutofixture;
List<Employee> employees = new List<Employee>()
{
    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");
Console.WriteLine("PDF Created Successfully!");
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);
        }
        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;
List<Employee> employees = new List<Employee>()
{
    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");
Console.WriteLine("PDF Created Successfully!");
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);
        }
        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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

AutoFixture C#(对开发人员的工作原理):图 4 - 搭配 IronPDF 的 Autofixture 输出

代码描述

所提供的 C# 代码利用 IronPDF 库生成 PDF 文档,列出员工及其年龄。 它定义了 EmployeePdfGenerator 类,并包含生成 PDF 的方法,该方法需要一个 Employee 对象列表和一个文件路径。 在内部,它通过 GenerateHtml 方法构建 HTML 内容,然后使用 IronPDF 的 HtmlToPdf 类将 HTML 呈现为 PDF,并保存在指定的文件路径下。 增强功能包括使用 StringBuilder 生成 HTML,并为 PDF 生成和文件保存添加基本的错误处理。

编写测试方法

在下面的设置中,AutoFixture 用于创建 Employee 类的实例,从而生成用于测试的随机数据。 采用 IronPdf 将包括员工信息在内的 HTML 内容无缝转换为 PDF 格式。 EmployeePdfGenerator 类负责协调这些流程,有效管理数据生成和 PDF 转换。 同时,EmployeePdfGeneratorTests XUnit 测试类通过严格的测试确保 PDF 生成功能的正确性。 这种集成方法简化了员工数据的生成和记录,确保了 PDF 生成过程的稳健性和可靠性。

using System;
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;
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
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 类包含 Employee 类的测试用例,可在文件路径上验证 PDF。

AutoFixture C#(如何为开发人员工作):图5 - AutoFixture C#

结论

AutoFixture 简化了在 .NET 中编写单元测试的 "安排 "阶段,为开发人员提供了一种专注于测试用例而非复杂设置的方法。 它简化了单元测试过程,通过自动生成测试数据,确保了输入的多样性和真实性。 结合IronPDF许可信息以确保持续使用和支持。

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
HttpListener C#(开发人员如何使用)
下一步 >
实体框架核心(开发者如何使用)