跳過到頁腳內容
.NET幫助

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 模型類別的原始碼。

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; }
}
$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
$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();
$vbLabelText   $csharpLabel

以上程式碼建立了一個具有自訂屬性的新 Person 物件。 它為 Person 物件初始化一個自訂 PersonBuilder,將 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();
$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}");
}
$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();
$vbLabelText   $csharpLabel

這將建立一個 personList,其中每個物件的預設值都覆寫為 Name = "Kim", Email = "abc@email.com", IsMarried = false。

範例 5:建立包含真實隨機資料的人員物件列表

為了在人員清單中獲得真實的資料值,您可以使用 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();
$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();
$vbLabelText   $csharpLabel

在這裡,All() 方法確保後續操作應用於記憶體中建立的所有 10 個 person 物件。 Do() 方法在每個 Person 物件上執行 Action 委託。 此設定從 501 開始按順序分配 Id 屬性,同樣地,按順序將每個人命名為"Person 1"到"Person 10"。

NBuilder .NET (開發者使用方法):圖 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;
    }
}
$vbLabelText   $csharpLabel

這裡,Person 類別具有幾個屬性,例如 EmailIsMarried,而 PersonServiceIsMarried,而 PersonServiceIsMarried,而 PersonService 包含給定方法 @ 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);
     }
}
$vbLabelText   $csharpLabel

此單元測試驗證了 GetPersonEmail 類別的方法能夠正確傳回具有預期電子郵件地址"Tom@email.com"的 Person 物件的電子郵件地址。 它使用 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();
$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>";
}
$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");
$vbLabelText   $csharpLabel

ChromePdfRenderer被實例化,用於將儲存在 htmlContent 中的 HTML 內容渲染成 PDF 文件。 產生的PDF文件將以"PersonList.pdf"的名稱儲存到檔案系統中。

輸出

以下是IronPDF產生的 PersonList 的輸出結果。 它包含五個人物,每個人物都有預設值。

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

結論

總之,NBuilder 是一個強大且靈活的工具,可用於在.NET中產生測試數據,簡化複雜物件圖的創建,並提高測試過程的效率。 透過與IronPDF集成,開發人員可以輕鬆擴展其應用程序,為那些認為 PDF 生成功能對其專案有價值的人添加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技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me