.NET 幫助

AutoFixture C#(開發人員的工作方式)

發佈 2024年8月13日
分享:

AutoFixture是一個開源庫用於.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#

程式碼描述

此測試代碼片段包含測試斷言,用於驗證 Employee 物件的屬性是否與隨機生成的值匹配。 它驗證字串類型屬性 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將文本轉換為 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
VB   C#

使用 AutoFixture 功能與 IronPDF 的程式碼範例

我們將首先建立一個 EmployeePdfGenerator 類別,其中包含生成員工的方法。

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 - 使用 AutoFixture 與 IronPDF 的輸出

程式碼描述

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

EmployeePdfGeneratorTests 類別包含 Employee 類別的測試案例,以驗證檔案路徑上的 PDF。

AutoFixture C#(開發人員如何使用):圖 5 - AutoFixture C#

結論

AutoFixture 簡化了在 .NET 中撰寫單元測試的「安排」階段,為開發者提供了專注於測試案例而非設置細節的方法。 它通過自動生成測試數據來簡化單元測試過程,確保多樣化和真實的輸入。 結合IronPDF Licensing Information繼續使用和支援。

< 上一頁
HttpListener C#(它如何為開發人員工作)
下一個 >
Entity Framework Core(它是如何為開發者工作的)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >