.NET 幫助

NBuilder .NET(其工作原理對開發者)

Kannaopat Udonpant
坎納帕特·烏頓潘
2024年8月13日
分享:

NBuilder是一个.NET 庫簡化測試數據生成。 開發人員可以利用其流暢的介面輕鬆地創建複雜的物件圖。 它提供靈活性、高效率以及與熱門測試框架的無縫整合。 在本文中,我們將探索NBuilder的功能、如何安裝它,並通過實際的代碼示例展示其能力。

NBuilder .NET(對開發者的運作方式):圖 1 - NBuilder

NBuilder 的功能

  1. NBuilder 是一個 C# 開源 .NET 函式庫,旨在簡化物件的建立,以用於測試和模擬目的。 它允許開發人員根據不同的資料類型快速生成具有預設或自訂輸入的物件。

  2. 它特別適用於單元測試、功能測試和整合測試。

  3. 這是測試內建 .NET 資料類型和複雜對象的基本套件之一。

  4. 它用於隨機數據生成。 您可以為這個開源專案作出貢獻。

  5. 使用 NBuilder,您可以輕鬆地覆蓋預設屬性並編寫自訂配置。

安裝 NBuilder

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

Install-Package 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; }
    }

範例 1:使用預設值創建一個 Person 物件

var person = Builder<Person>
                .CreateNew()
                .Build();
// person = { Id = 1, Name = Name1, Email = Email1 , IsMarried  = false }
var person = Builder<Person>
                .CreateNew()
                .Build();
// person = { Id = 1, Name = Name1, Email = Email1 , IsMarried  = false }

範例圖片

NBuilder .NET(對於開發人員的運作方式):圖 3 - 含有值的 Person 物件

範例 2:使用自定義生成器創建物件

以下是如何使用 NBuilder 創建並配置帶有自定義屬性的 Person 物件的示例:

var customPersonBuilder = Builder<Person>.CreateNew()
                .With(p => p.Name = "Tom")
                .With(p => p.Email = "Tom@email.com");
var objTom = customPersonBuilder.Build();
var customPersonBuilder = Builder<Person>.CreateNew()
                .With(p => p.Name = "Tom")
                .With(p => p.Email = "Tom@email.com");
var objTom = customPersonBuilder.Build();

上述程式碼建立了一個具有自定屬性的 Person 對象。 它初始化了一個自訂 customPersonBuilder 用於 Person 物件,將名字設為 "Tom" 並將電子郵件設為 "Tom@email.com"。 最後,它會構建對象並將其分配給 objTom。

範例 3:使用預設值建立人員物件列表

var personList = Builder<Person>
                                     .CreateListOfSize(10)
                                     .Build();
var personList = Builder<Person>
                                     .CreateListOfSize(10)
                                     .Build();

範例圖片

NBuilder .NET(它如何為開發人員工作):圖4 - Person對象列表

這裡的 personList 有 10 個物件及其預設值並將它們打印出來。

var personList = Builder<Person>
                                            .CreateListOfSize(10)
                                            .Build();
// Here it creates the 10 objects of Person in personList
foreach (var person in personList)
{
    Console.WriteLine($"{person.Id}, {person.Name}, {person.Email}, {person.IsMarried}, ");
}
var personList = Builder<Person>
                                            .CreateListOfSize(10)
                                            .Build();
// Here it creates the 10 objects of Person in personList
foreach (var person in personList)
{
    Console.WriteLine($"{person.Id}, {person.Name}, {person.Email}, {person.IsMarried}, ");
}

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

範例 4:自定義生成的對象

有時您可能需要自訂正在創建的對象。 您還可以使用 with 自訂物件的值。()方法。

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();
// Output:  
//    Id:  1, Name: Name1, Email: Email1, IsMarried False,
//    Id : 2, Name: Name2, Email: Email2, IsMarried True,
//    Id : 3, Name: Name3, Email: Email3, IsMarried False,
//    Id : 4, Name: Name4, Email: Email4, IsMarried True,
//    Id : 5, Name: Name5, Email: Email5, IsMarried False,
//    Id : 6, Name: Name6, Email: Email6, IsMarried True,
//    Id : 7, Name: Name7, Email: Email7, IsMarried False,
//    Id : 8, Name: Name8, Email: Email8, IsMarried True,
//    Id : 9, Name: Name9, Email: Email9, IsMarried False,
//    Id : 10, Name: Name10, Email: Email10, IsMarried True,
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();
// Output:  
//    Id:  1, Name: Name1, Email: Email1, IsMarried False,
//    Id : 2, Name: Name2, Email: Email2, IsMarried True,
//    Id : 3, Name: Name3, Email: Email3, IsMarried False,
//    Id : 4, Name: Name4, Email: Email4, IsMarried True,
//    Id : 5, Name: Name5, Email: Email5, IsMarried False,
//    Id : 6, Name: Name6, Email: Email6, IsMarried True,
//    Id : 7, Name: Name7, Email: Email7, IsMarried False,
//    Id : 8, Name: Name8, Email: Email8, IsMarried True,
//    Id : 9, Name: Name9, Email: Email9, IsMarried False,
//    Id : 10, Name: Name10, Email: Email10, IsMarried True,

這將創建一個 personList,默認值為 Name = “Kim”、Email = “abc@email.com”,以及 IsMarried = false。

範例 5: 使用現實隨機數據創建人員對象清單

為了在 Person List 中獲取逼真的數據值,您可以使用 Faker Library .NET 獲取數據的真實值。

var personList = Builder<Person>
                .CreateListOfSize(10)
                .All()
                .With(p => p.Name = Faker.Name.FullName())
                .With(p => p.Id = Faker.RandomNumber.Next(20, 60))
                .Build();
var personList = Builder<Person>
                .CreateListOfSize(10)
                .All()
                .With(p => p.Name = Faker.Name.FullName())
                .With(p => p.Id = Faker.RandomNumber.Next(20, 60))
                .Build();

範例6:創建具有序列化數據的人物物件列表

有時你可能需要生成具有連續數據的對象。 NBuilder .NET 通過使用 Do 方法來實現這一點。

var personList = Builder<Person>.CreateListOfSize(10)
                .All()
                .Do((p, i) => p.Id = 501 + i)
                .Do((p, i) => p.Name = $"Person {i + 1}")
                .Build();
var personList = Builder<Person>.CreateListOfSize(10)
                .All()
                .Do((p, i) => p.Id = 501 + i)
                .Do((p, i) => p.Name = $"Person {i + 1}")
                .Build();

在這裡,全部()方法適用於隨後的操作,對所有 10 個人對象進行操作,並在記憶體中創建一個列表。 行動者()該方法用於在每個Person物件上執行Action委派。

在這種情況下,它將每個人指定的 Id 屬性設定為 501。lambda 表達式(p, i)取兩個參數:p 是人,i 是該特定對象在列表中的索引,從(0 到 9)因為清單有 10 個物件。 透過在 Id 屬性中添加 i 值,屬性將依次設定從 501 到 510,並且 Name 屬性將設定為 Person 1 到 Person 10。

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

範例 7:結合 NBuilder 與使用 Xunit 的單元測試

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;
        }
    }

在這裡,類別 Person 有以下屬性,而 PersonService 只有一個公共方法 GetPersonEmail。()返回該特定對象的 Person 電子郵件。

測試類別和測試數據

public class PersonTests
{
     [Fact]
     public void GetPersonEmail_ReturnCorrectEmail()
     {
         // Arrange
         var service = new PersonService();
         string expectedEmail = "Tom@email.com";
         var person = Builder<Person>.CreateNew()
             .With(p => p.Name = "Tom")
             .With(p => p.Email "Tom@email.com")
             .Build();
         // Act
         var actualEmail = service.GetPersonEmailById(person);
         // Assert
         Assert.Equal(actualEmail, expectedEmail);
     }
}
public class PersonTests
{
     [Fact]
     public void GetPersonEmail_ReturnCorrectEmail()
     {
         // Arrange
         var service = new PersonService();
         string expectedEmail = "Tom@email.com";
         var person = Builder<Person>.CreateNew()
             .With(p => p.Name = "Tom")
             .With(p => p.Email "Tom@email.com")
             .Build();
         // Act
         var actualEmail = service.GetPersonEmailById(person);
         // Assert
         Assert.Equal(actualEmail, expectedEmail);
     }
}

該單元測試驗證了 PersonService 類的 GetPersonEmailById 方法是否正確返回具有預期電子郵件 "Tom@email.com" 的 Person 物件的電子郵件地址。 它使用安排-執行-斷言模式來設置測試數據,執行該方法,然後檢查實際結果是否符合預期結果。

將 NBuilder 與 IronPDF 整合

了解 IronPDF是一個專為從 HTML 建立 PDF在 .NET 應用程式中。 憑藉其直觀的 API,開發人員可以將 PDF 功能無縫整合到他們的項目中,無論是生成發票、報告還是互動表單。

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

安裝 IronPDF

開啟 NuGet 套件管理器主控台,並執行以下命令:

Install-Package IronPdf
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();

使用 IronPDF 創建 PDF 文件

此代碼設置IronPDF授權密鑰並從Person對象列表生成HTML內容。

IronPdf.License.LicenseKey = "Your-License-Key";
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>";
}
IronPdf.License.LicenseKey = "Your-License-Key";
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>";
}

IronPdf.License.LicenseKey 使用特定的授權金鑰來啟用 IronPDF 的功能。

HTML 內容是透過遍歷人員列表動態構建的,將每個 Person 對象的詳細信息附加上去。(ID, 名稱, 電子郵件, 已婚)嵌入到HTML結構中。

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

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

var renderer = new ChromePdfRenderer();
var pdfDoc = renderer.RenderHtmlAsPdf(htmlContent);
pdfDoc.SaveAs("PersonList.pdf");
var renderer = new ChromePdfRenderer();
var pdfDoc = renderer.RenderHtmlAsPdf(htmlContent);
pdfDoc.SaveAs("PersonList.pdf");

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

輸出

下面是由IronPDF生成的PersonList的輸出。 它包含五個人,每個人都有預設值。

NBuilder .NET(針對開發人員的運作方式):圖8 - PDF 輸出

結論

總結而言,NBuilder 是一個強大且靈活的工具,用於在 .NET 中生成測試數據,簡化複雜對象圖的創建,並提高測試過程的效率。 通過集成IronPDF,開發人員可以輕鬆擴展他們的應用程式以包括PDF 生成功能對於那些認為它對他們的項目有價值的人。 NBuilder 和 IronPDF 共同配合可以顯著提升開發工作流程,使測試和文件生成順暢且高效。

Kannaopat Udonpant
坎納帕特·烏頓潘
軟體工程師
在成為軟體工程師之前,Kannapat 在日本北海道大學完成了環境資源博士學位。在攻讀學位期間,Kannapat 也成為了車輛機器人實驗室的成員,該實驗室隸屬於生物生產工程學系。2022 年,他利用自己的 C# 技能,加入了 Iron Software 的工程團隊,專注於 IronPDF 的開發。Kannapat 珍視這份工作,因為他可以直接向負責撰寫大部分 IronPDF 程式碼的開發人員學習。除了同儕學習外,Kannapat 還享受在 Iron Software 工作的社交方面。當他不在撰寫程式碼或文件時,Kannapat 通常會在 PS5 上玩遊戲或重看《最後生還者》。
< 上一頁
Refit C#(它如何為開發人員工作)
下一個 >
C# TryParse(開發者如何使用)