跳過到頁腳內容
.NET幫助

NBuilder .NET(對於開發者的運行原理)

NBuilder is a .NET 庫,簡化測試數據的生成。 開發人員可以使用其流暢接口輕鬆創建複雜的對象圖。 它提供靈活性、高效性,並與流行的測試框架無縫集成。 在本文中,我們將探討NBuilder的特性,如何安裝它,並通過實用的代碼示例展示其功能。

NBuilder .NET(開發人員的工作原理):圖1 - NBuilder

NBuilder的特點

  1. NBuilder是一個 C# 開源 .NET 庫,旨在簡化對象的創建以進行測試和模擬。 它允許開發人員快速生成具有默認或自定義輸入的對象,基於不同的數據類型。
  2. 它對於單元測試、功能測試和集成測試特別有用。
  3. 它是內置 .NET 數據類型和複雜對象測試的基本包之一。
  4. 它用於隨機數據生成。 你可以為這個開源項目做出貢獻。
  5. 使用 NBuilder,你可以輕鬆覆蓋默認屬性並編寫自定義配置。

安裝 NBuilder

要在 NuGet 包管理器控制台中安裝 NBuilder,請使用以下命令。

Install-Package NBuilder

上述命令將安裝 NBuilder 及其所有依賴項。

NBuilder .NET(開發人員的工作原理):圖2 - 安裝 NBuilder

NBuilder的使用

NBuilder 提供了一種即時創建對象的流暢方式。 讓我們從一個創建對象的簡單示例開始。

這是 Person 模型類的源代碼。

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool IsMarried { get; set; }
}
class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool IsMarried { get; set; }
}
Friend Class Person
	Public Property Id() As Integer
	Public Property Name() As String
	Public Property Email() As String
	Public Property IsMarried() As Boolean
End Class
$vbLabelText   $csharpLabel

示例1:用默認值創建 Person 對象

// Create a new person object with default values using NBuilder
var person = Builder<Person>
                .CreateNew()
                .Build();
// By default, NBuilder can provide values like 
// Id = 1, Name = Name1, Email = Email1, IsMarried = false
// Create a new person object with default values using NBuilder
var person = Builder<Person>
                .CreateNew()
                .Build();
// By default, NBuilder can provide values like 
// Id = 1, Name = Name1, Email = Email1, IsMarried = false
' Create a new person object with default values using NBuilder
Dim person = Builder(Of Person) .CreateNew().Build()
' By default, NBuilder can provide values like 
' Id = 1, Name = Name1, Email = Email1, IsMarried = false
$vbLabelText   $csharpLabel

樣本圖像

NBuilder .NET(開發人員的工作原理):圖3 - 具有值的 Person 對象

示例2:使用自定義構建器創建對象

以下是一個使用 NBuilder 創建和配置帶有自定義屬性的 Person 對象的示例:

// Initialize a custom builder for the Person object with specific values
var customPersonBuilder = Builder<Person>.CreateNew()
                .With(p => p.Name = "Tom")
                .With(p => p.Email = "Tom@email.com");
// Build the custom person object with the specified properties
var objTom = customPersonBuilder.Build();
// Initialize a custom builder for the Person object with specific values
var customPersonBuilder = Builder<Person>.CreateNew()
                .With(p => p.Name = "Tom")
                .With(p => p.Email = "Tom@email.com");
// Build the custom person object with the specified properties
var objTom = customPersonBuilder.Build();
' Initialize a custom builder for the Person object with specific values
Dim customPersonBuilder = Builder(Of Person).CreateNew().With(Sub(p) p.Name = "Tom").With(Sub(p) p.Email = "Tom@email.com")
' Build the custom person object with the specified properties
Dim objTom = customPersonBuilder.Build()
$vbLabelText   $csharpLabel

上述代碼創建了一個帶有自定義屬性的新的 Person 對象。 它為 Person 對象初始化了一個 customPersonBuilder,將名稱設置為 "Tom",電子郵件設置為 "Tom@email.com"。 最後,它構建該對象並將其分配給 objTom。

示例3:創建一個具有默認值的 Person 對象列表

// Create a list of 10 Person objects with default values using NBuilder
var personList = Builder<Person>
                                     .CreateListOfSize(10)
                                     .Build();
// Create a list of 10 Person objects with default values using NBuilder
var personList = Builder<Person>
                                     .CreateListOfSize(10)
                                     .Build();
' Create a list of 10 Person objects with default values using NBuilder
Dim personList = Builder(Of Person) .CreateListOfSize(10).Build()
$vbLabelText   $csharpLabel

樣本圖像

NBuilder .NET(開發人員的工作原理):圖4 - Person 對象列表

此處的 personList 具有 10 個對象,其默認值並打印它們。

// Creating a list of 10 Person objects with default values
var personList = Builder<Person>
                                            .CreateListOfSize(10)
                                            .Build();

// Print details of each Person object in the list
foreach (var person in personList)
{
    Console.WriteLine($"{person.Id}, {person.Name}, {person.Email}, {person.IsMarried}");
}
// Creating a list of 10 Person objects with default values
var personList = Builder<Person>
                                            .CreateListOfSize(10)
                                            .Build();

// Print details of each Person object in the list
foreach (var person in personList)
{
    Console.WriteLine($"{person.Id}, {person.Name}, {person.Email}, {person.IsMarried}");
}
' Creating a list of 10 Person objects with default values
Dim personList = Builder(Of Person) .CreateListOfSize(10).Build()

' Print details of each Person object in the list
For Each person In personList
	Console.WriteLine($"{person.Id}, {person.Name}, {person.Email}, {person.IsMarried}")
Next person
$vbLabelText   $csharpLabel

NBuilder .NET(開發人員的工作原理):圖5 - 自動分配值

示例4:定制生成的對象

有時候你可能需要定制正在創建的對象。 您還可以使用 With() 方法自定義對象的值。

// Customize properties for all Person objects in the list
var personList = Builder<Person>
                .CreateListOfSize(10)
                .All()
                .With(p => p.Name = "Kim")
                .With(p => p.Email = "abc@email.com")
                .With(p => p.IsMarried = false)
                .Build();
// Customize properties for all Person objects in the list
var personList = Builder<Person>
                .CreateListOfSize(10)
                .All()
                .With(p => p.Name = "Kim")
                .With(p => p.Email = "abc@email.com")
                .With(p => p.IsMarried = false)
                .Build();
' Customize properties for all Person objects in the list
Dim personList = Builder(Of Person) .CreateListOfSize(10).All().With(Sub(p) p.Name = "Kim").With(Sub(p) p.Email = "abc@email.com").With(Sub(p) p.IsMarried = False).Build()
$vbLabelText   $csharpLabel

這創建了一個 personList,其中每個對象的默認值被覆蓋為 Name = "Kim",Email = "abc@email.com",並且 IsMarried = false。

示例5:創建具有現實隨機數據的 Person 對象列表

為了在 Person 列表中獲得現實的數據值,可以使用 Faker Library .NET 生成現實數據。

// Creating a list of Person objects with random yet realistic values using Faker
var personList = Builder<Person>
                .CreateListOfSize(10)
                .All()
                .With(p => p.Name = Faker.Name.FullName())
                .With(p => p.Id = Faker.RandomNumber.Next(20, 60))
                .Build();
// Creating a list of Person objects with random yet realistic values using Faker
var personList = Builder<Person>
                .CreateListOfSize(10)
                .All()
                .With(p => p.Name = Faker.Name.FullName())
                .With(p => p.Id = Faker.RandomNumber.Next(20, 60))
                .Build();
' Creating a list of Person objects with random yet realistic values using Faker
Dim personList = Builder(Of Person) .CreateListOfSize(10).All().With(Sub(p) p.Name = Faker.Name.FullName()).With(Sub(p) p.Id = Faker.RandomNumber.Next(20, 60)).Build()
$vbLabelText   $csharpLabel

示例6:創建具有序列數據的 Person 對象列表

有時你可能需要生成具有序列數據的對象。 NBuilder .NET 通過使用 Do 方法促進了這一點。

// Creating a list of 10 sequential Person objects using NBuilder
var personList = Builder<Person>.CreateListOfSize(10)
                .All()
                .Do((p, i) => p.Id = 501 + i)
                .Do((p, i) => p.Name = $"Person {i + 1}")
                .Build();
// Creating a list of 10 sequential Person objects using NBuilder
var personList = Builder<Person>.CreateListOfSize(10)
                .All()
                .Do((p, i) => p.Id = 501 + i)
                .Do((p, i) => p.Name = $"Person {i + 1}")
                .Build();
' Creating a list of 10 sequential Person objects using NBuilder
Dim personList = Builder(Of Person).CreateListOfSize(10).All().Do(Sub(p, i) p.Id = 501 + i).Do(Sub(p, i) p.Name = $"Person {i + 1}").Build()
$vbLabelText   $csharpLabel

在此,All() 方法確保隨後的操作應用於存儲器中創建的所有 10 個 person 對象。 Do() 方法在每個 Person 對象上執行 Action 委託。 此設置從 501 開始對 Id 屬性進行順序分配,並且同樣將每個人的名字按順序命名為 "Person 1" 至 "Person 10"。

NBuilder .NET(開發人員的工作原理):圖6 - 序列數據

示例7:使用 Xunit 進行單元測試的 NBuilder

NBuilder 在 .NET 中在測試環境中用得很多,開發人員需要生成一個現實且多樣化的數據集來進行測試。 它使得測試變得簡單且容易維護, 這些精細的對象允許開發人員使用 lambda 表達式和委託函數定義自定義初始化邏輯,滿足那些對高效且靈活的測試數據生成有需求的人。

單元測試的模型類和服務

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool IsMarried { get; set; }
}

class PersonService
{
    public string GetPersonEmail(Person person)
    {
        return person.Email;
    }
}
class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public bool IsMarried { get; set; }
}

class PersonService
{
    public string GetPersonEmail(Person person)
    {
        return person.Email;
    }
}
Friend Class Person
	Public Property Id() As Integer
	Public Property Name() As String
	Public Property Email() As String
	Public Property IsMarried() As Boolean
End Class

Friend Class PersonService
	Public Function GetPersonEmail(ByVal person As Person) As String
		Return person.Email
	End Function
End Class
$vbLabelText   $csharpLabel

這裡,Person 類具有幾個屬性,例如 IdNameEmailIsMarried,而 PersonService 包含一個方法 GetPersonEmail(),返回給定 Person 的電子郵件。

測試類和測試數據

using Xunit;

public class PersonTests
{
     [Fact]
     public void GetPersonEmail_ReturnCorrectEmail()
     {
         // Arrange
         var service = new PersonService();
         string expectedEmail = "Tom@email.com";

         // Create a person with specific name and email using NBuilder
         var person = Builder<Person>.CreateNew()
             .With(p => p.Name = "Tom")
             .With(p => p.Email = "Tom@email.com")
             .Build();

         // Act
         var actualEmail = service.GetPersonEmail(person);

         // Assert
         Assert.Equal(expectedEmail, actualEmail);
     }
}
using Xunit;

public class PersonTests
{
     [Fact]
     public void GetPersonEmail_ReturnCorrectEmail()
     {
         // Arrange
         var service = new PersonService();
         string expectedEmail = "Tom@email.com";

         // Create a person with specific name and email using NBuilder
         var person = Builder<Person>.CreateNew()
             .With(p => p.Name = "Tom")
             .With(p => p.Email = "Tom@email.com")
             .Build();

         // Act
         var actualEmail = service.GetPersonEmail(person);

         // Assert
         Assert.Equal(expectedEmail, actualEmail);
     }
}
Imports Xunit

Public Class PersonTests
	 <Fact>
	 Public Sub GetPersonEmail_ReturnCorrectEmail()
		 ' Arrange
		 Dim service = New PersonService()
		 Dim expectedEmail As String = "Tom@email.com"

		 ' Create a person with specific name and email using NBuilder
		 Dim person = Builder(Of Person).CreateNew().With(Sub(p) p.Name = "Tom").With(Sub(p) p.Email = "Tom@email.com").Build()

		 ' Act
		 Dim actualEmail = service.GetPersonEmail(person)

		 ' Assert
		 Assert.Equal(expectedEmail, actualEmail)
	 End Sub
End Class
$vbLabelText   $csharpLabel

此單元測試驗證 PersonService 類的 GetPersonEmail 方法能正確返回 Person 對象的電子郵件地址,預期的電子郵件為 "Tom@email.com"。 它使用日程-行動-確認模式設置測試數據,執行方法,然後檢查實際結果是否與預期結果匹配。

將 NBuilder 與 IronPDF 集成

Learn About IronPDF is a powerful C# library designed for 在 .NET 應用程序內生成 PDF。 憑藉其直觀的 API,開發人員可以將 PDF 功能無縫集成到其項目中,無論他們是在生成發票、報告還是互動式表單。

NBuilder .NET(開發人員的工作原理):圖7 - IronPDF

安裝 IronPDF

打開 NuGet 套件管理控制台,運行以下命令:

Install-Package IronPdf

填充5個 Person 對象列表

// Generating instances of the Person class with NBuilder
var people = Builder<Person>.CreateListOfSize(5).Build();
// Generating instances of the Person class with NBuilder
var people = Builder<Person>.CreateListOfSize(5).Build();
' Generating instances of the Person class with NBuilder
Dim people = Builder(Of Person).CreateListOfSize(5).Build()
$vbLabelText   $csharpLabel

使用 IronPDF 創建 PDF 文檔

此代碼設置 IronPDF 許可證密鑰,並從 Person 對象列表生成 HTML 內容。

// Setting the IronPDF license key
IronPdf.License.LicenseKey = "Your-License-Key";

// Building HTML content from Person object list
var htmlContent = "<h1>Person List</h1>";
foreach (var person in people)
{
    htmlContent += $"<p>Id: {person.Id}, Name: {person.Name}, Email: {person.Email}, IsMarried: {person.IsMarried}</p>";
}
// Setting the IronPDF license key
IronPdf.License.LicenseKey = "Your-License-Key";

// Building HTML content from Person object list
var htmlContent = "<h1>Person List</h1>";
foreach (var person in people)
{
    htmlContent += $"<p>Id: {person.Id}, Name: {person.Name}, Email: {person.Email}, IsMarried: {person.IsMarried}</p>";
}
' Setting the IronPDF license key
IronPdf.License.LicenseKey = "Your-License-Key"

' Building HTML content from Person object list
Dim htmlContent = "<h1>Person List</h1>"
For Each person In people
	htmlContent &= $"<p>Id: {person.Id}, Name: {person.Name}, Email: {person.Email}, IsMarried: {person.IsMarried}</p>"
Next person
$vbLabelText   $csharpLabel

設置 IronPdf.License.LicenseKey 為特定的許可證密鑰以啟用 IronPDF 的功能。 通過遍歷 people 列表動態構建 HTML 內容,將每個 Person 對象的詳細信息(Id、Name、Email、IsMarried)附加到 HTML 結構中。

使用 IronPDF 在 PDF 文檔中渲染 Person 列表

此代碼使用 IronPDF 的 ChromePdfRenderer 將 HTML 內容轉換為 PDF 文檔。

// Rendering HTML content into a PDF document using IronPDF
var renderer = new ChromePdfRenderer();
var pdfDoc = renderer.RenderHtmlAsPdf(htmlContent);
pdfDoc.SaveAs("PersonList.pdf");
// Rendering HTML content into a PDF document using IronPDF
var renderer = new ChromePdfRenderer();
var pdfDoc = renderer.RenderHtmlAsPdf(htmlContent);
pdfDoc.SaveAs("PersonList.pdf");
' Rendering HTML content into a PDF document using IronPDF
Dim renderer = New ChromePdfRenderer()
Dim pdfDoc = renderer.RenderHtmlAsPdf(htmlContent)
pdfDoc.SaveAs("PersonList.pdf")
$vbLabelText   $csharpLabel

ChromePdfRenderer 調用實例將存儲於 htmlContent 中的 HTML 內容渲染為 PDF 文檔。 生成的 PDF 文檔以 "PersonList.pdf" 的名稱保存到文件系統。

輸出

以下是 IronPDF 生成的 PersonList 的輸出。 它包含五個人,每個人都有默認值。

NBuilder .NET(開發人員的工作原理):圖8 - PDF 輸出

結論

總之,NBuilder 是一個強大而靈活的工具,用於在 .NET 中生成測試數據,簡化複雜對象圖的創建,並提高測試過程的效率。 通過與 IronPDF 的集成,開發人員可以輕鬆擴展其應用程序<,以包括PDF 生成功能,對那些覺得對他們的項目有價值的人來說。 NBuilder 和 IronPDF 的結合可以顯著增強開發工作流程,讓測試和文檔生成變得無縫且高效。

常見問題解答

如何在.NET中使用NBuilder生成測試數據?

NBuilder提供了一個流暢的界面,允許開發人員輕鬆生成複雜的對象圖和測試數據。您可以使用像CreateNew()CreateListOfSize()這樣的方法來生成單個對象或具有默認或自定義值的對象列表。

如何在.NET項目中安裝NBuilder?

要安裝NBuilder,可以在NuGet包管理器控制台中使用命令:Install-Package NBuilder。這將下載並安裝NBuilder及其必要的依賴項。

NBuilder能用來生成隨機和連續數據嗎?

是的,NBuilder支持生成隨機和連續數據。您可以使用With()等方法來自定義對象屬性的隨機值,或者使用Do()按順序設置屬性。

將NBuilder與IronPDF集成有哪些好處?

將NBuilder與IronPDF集成允許開發人員創建複雜的測試數據並將其輸出為PDF。這可以通過從測試數據生成動態PDF來增強.NET應用程序,簡化開發工作流程。

NBuilder如何在單元測試中提供幫助?

NBuilder在單元測試中很有價值,它允許開發人員快速生成逼真的測試數據。它簡化了具有複雜對象圖的測試場景設置,使得測試更容易維護且更有效。

使用NBuilder的流暢界面的優勢是什麼?

NBuilder中的流暢界面允許開發人員以可讀且簡潔的方式鏈接方法調用來創建複雜對象圖。這增強了代碼的可讀性,並減少了生成測試數據時的樣板代碼。

如何使用NBuilder創建對象列表?

您可以使用NBuilder的CreateListOfSize()方法創建對象列表。例如,Builder.CreateListOfSize(10).Build()生成了一個包含10個Person對象的列表。

使用NBuilder的一些故障排除提示是什麼?

確保已通過NuGet正確安裝NBuilder,並驗證您的項目引用是最新的。如果遇到問題,檢查NBuilder GitHub庫或社區論壇可能會提供有用的見解和解決方案。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。