跳至頁尾內容
開發者更新

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

NBuilder 是一個 .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 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(開發者如何運作):圖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:建立具有預設值的 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 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:建立具有順序資料的 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 類有多個屬性,包括 EmailIsMarried,而 PersonService 包含一個方法 GetPersonEmail(),它返回所給 Person 的 email。

測試類與測試資料

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 類的 PersonService 方法是否會正確返回 Person 物件預期的 email 地址"Tom@email.com"。 它使用 Arrange-Act-Assert 模式來設置測試資料、執行方法,然後檢查實際結果是否與預期結果匹配。

將 NBuilder 與 IronPDF 整合

了解關於 IronPDF 是一個強大的 C# 程式庫,旨在 在 .NET 應用程式中從 HTML 製作 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 的功能。 HTML 內容透過迭代 people 清單動態建構,將每個 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的一些疑難解答提示是什麼?

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

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

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

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