跳過到頁腳內容
.NET幫助

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

NBuilder 是一個簡化測試資料產生的 .NET 函式庫。 開發人員可以利用其流利的介面毫不費力地建立複雜的物件圖形。 它提供彈性、效率,以及與熱門測試框架的無縫整合。 在這篇文章中,我們將探討 NBuilder 的功能、如何安裝,並透過實際的程式碼範例來展示其功能。

NBuilder .NET (How It Works For Developers):圖 1 - NBuilder

NBuilder 的特點

1.NBuilder 是 C# 開放原始碼的 .NET 函式庫,設計用來簡化物件的建立,以達到測試和模擬的目的。 它可讓開發人員根據不同的資料類型,快速產生具有預設或自訂指定輸入的物件。 2.它對單元測試、功能測試和整合測試特別有用。 3.它是測試內建 .NET 資料類型和複雜物件的必備套件之一。 4.用於隨機資料產生。 您可以為這個開放原始碼專案做出貢獻。 5.使用 NBuilder,您可以毫不費力地覆寫預設屬性和撰寫自訂組態。

安裝 NBuilder

要在 NuGet Package Manager Console 中安裝 NBuilder,請使用下列指令。

Install-Package NBuilder

上述命令將安裝 NBuilder 及其所有相依性。

NBuilder .NET (How It Works For Developers):圖 2 - 安裝 NBuilder

NBuilder 的使用方法

NBuilder 提供了一種流暢的方式來快速建立物件。 讓我們從建立物件的簡單範例開始。

以下是 Person Model Class 原始碼。

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 (How It Works For Developers):圖 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,設定 Name 為"Tom",Email 為"Tom@email.com"。 最後,它會建立物件並將其指定給 objTom。

範例 3:建立具有預設值的人物物件清單

// 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 (How It Works For Developers):圖 4 - 個人物件清單

這裡 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 (How It Works For Developers):圖 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 List 中取得真實的資料值,您可以使用 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:使用序列資料建立人物物件清單

有時候您可能需要產生具有連續資料的物件。 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 (How It Works For Developers):圖 6 - 序列資料

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

.NET 中的 NBuilder 主要用於測試環境,開發人員需要在此環境中產生真實且多樣化的測試資料集。 它使用複雜的物件讓測試變得容易且可維護,這些物件可讓開發人員使用 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

此單元測試驗證了 GetPersonEmail 類別的方法能夠正確傳回具有預期電子郵件地址"Tom@email.com"的 Person 物件的電子郵件地址。 它使用 Arrange-Act-Assert 模式來設定測試資料、執行方法,然後檢查實際結果是否與預期結果相符。

將 NBuilder 與 IronPDF 整合。

瞭解 IronPDF 是一個功能強大的 C# 函式庫,專為在 .NET 應用程式中 從 HTML 建立 PDF 而設計。 透過其直覺的 API,開發人員可以將 PDF 功能無縫整合到他們的專案中,無論是產生發票、報告或互動表單。

NBuilder .NET (How It Works For Developers):圖 7 - IronPDF

安裝 IronPDF。

開啟 NuGet Package Manager 主控台,並執行下列指令:

Install-Package IronPdf

填入 5 個人物件清單

// 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 的功能。 HTML 內容是透過遍歷 people 清單動態建構的,將每個 Person 物件的詳細資訊(Id、Name、Email、IsMarried)附加到 HTML 結構中。

使用 IronPDF 渲染 PDF 文件中的人員名單

本代碼使用 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 (How It Works For Developers):圖 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庫或社區論壇可能會提供有用的見解和解決方案。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我