在生產環境中測試,無水印。
在任何需要的地方都能運行。
獲得 30 天的全功能產品。
在幾分鐘內上手運行。
試用產品期間完全訪問我們的支援工程團隊
NBuilder是一个.NET 庫簡化測試數據生成。 開發人員可以利用其流暢的介面輕鬆地創建複雜的物件圖。 它提供靈活性、高效率以及與熱門測試框架的無縫整合。 在本文中,我們將探索NBuilder的功能、如何安裝它,並通過實際的代碼示例展示其能力。
NBuilder 是一個 C# 開源 .NET 函式庫,旨在簡化物件的建立,以用於測試和模擬目的。 它允許開發人員根據不同的資料類型快速生成具有預設或自訂輸入的物件。
它特別適用於單元測試、功能測試和整合測試。
這是測試內建 .NET 資料類型和複雜對象的基本套件之一。
它用於隨機數據生成。 您可以為這個開源專案作出貢獻。
要在 NuGet 套件管理器控制台中安裝 NBuilder,請使用以下命令。
Install-Package Nbuilder
Install-Package 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; }
}
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 創建並配置帶有自定義屬性的 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。
var personList = Builder<Person>
.CreateListOfSize(10)
.Build();
var personList = Builder<Person>
.CreateListOfSize(10)
.Build();
這裡的 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}, ");
}
有時您可能需要自訂正在創建的對象。 您還可以使用 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。
為了在 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。
範例 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 物件的電子郵件地址。 它使用安排-執行-斷言模式來設置測試數據,執行該方法,然後檢查實際結果是否符合預期結果。
了解 IronPDF是一個專為從 HTML 建立 PDF在 .NET 應用程式中。 憑藉其直觀的 API,開發人員可以將 PDF 功能無縫整合到他們的項目中,無論是生成發票、報告還是互動表單。
開啟 NuGet 套件管理器主控台,並執行以下命令:
Install-Package IronPdf
Install-Package IronPdf
// 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授權密鑰並從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的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 中生成測試數據,簡化複雜對象圖的創建,並提高測試過程的效率。 通過集成IronPDF,開發人員可以輕鬆擴展他們的應用程式以包括PDF 生成功能對於那些認為它對他們的項目有價值的人。 NBuilder 和 IronPDF 共同配合可以顯著提升開發工作流程,使測試和文件生成順暢且高效。