.NET 帮助

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

发布 2024年八月13日
分享:

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

介绍

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

AutoFixture C#(适用于开发者的工作原理):图1 - AutoFixture

安装和设置AutoFixture

AutoFixture 作为 NuGet 包提供,可以安装。这可以通过使用 NuGet 包管理器控制台或 .NET 添加包 Visual Studio 的 NuGet 包管理器 UI 来完成。

Install-Package AutoFixture
Install-Package AutoFixture
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

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
VB   C#

代码描述

现在,Employee 类封装了员工的基本信息,包括他们的名字、姓氏和年龄,分别由 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
VB   C#

代码描述

这段代码片段将 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
VB   C#

代码描述

测试方法 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
VB   C#

代码描述

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

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

介绍 IronPDF

IronPDF 是由开发的强大C# PDF库 铁软件 促进 阅读创建 PDF文档。这个多功能工具能够将带有样式信息的易格式化文档转换为高质量的PDF。使用IronPDF, 生成PDF 从HTML文本中提取内容是一个无缝的过程,允许用户从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
VB   C#

使用Autofixture功能与IronPDF的代码示例

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

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
VB   C#

AutoFixture C#(开发人员工作原理):图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;
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));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

这里的EmployeePdfGeneratorTests类包含了对Employee类的测试用例,这些用例验证了文件路径上的PDF。

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

结论

AutoFixture 简化了在 .NET 中编写单元测试时的 '安排' 阶段,为开发人员提供了一种关注测试用例而不是设置复杂性的方式。它通过自动生成测试数据来简化单元测试过程,确保多样化和现实的输入。 IronPDF 以进行持续使用和支持。

< 前一页
HttpListener C#(开发人员如何使用)
下一步 >
实体框架核心(开发者如何使用)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,731,156 查看许可证 >