NBuilder .NET(开发人员如何使用)
NBuilder 是一个简化测试数据生成的 .NET 库。 开发人员可以通过其流畅的接口轻松创建复杂的对象图。 它提供灵活性、效率,并与流行的测试框架无缝集成。 在本文中,我们将探讨 NBuilder 的功能、如何安装它,并通过实际代码示例演示其功能。

NBuilder 的功能
- NBuilder 是一个 C# 开源 .NET 库,旨在简化对象的创建以进行测试和模拟用途。 它允许开发人员快速生成基于不同数据类型的默认或自定义输入的对象。
- 对于单元测试、功能测试和集成测试特别有用。
- 它是测试内置 .NET 数据类型和复杂对象的基本包之一。
- 它用于随机数据生成。 您可以为此开源项目做出贡献。
- 使用 NBuilder,您可以轻松覆盖默认属性并编写自定义配置。
安装 NBuilder
要在 NuGet 包管理器控制台中安装 NBuilder,请使用以下命令。
Install-Package NBuilder
上述命令将安装 NBuilder 及其所有依赖项。

NBuilder 的使用
NBuilder 提供了一种动态创建对象的流畅方式。 让我们从一个创建对象的简单示例开始。
这是人员模型类的源代码。
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
示例 1:创建具有默认值的人员对象
// 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
示例图像

示例 2:使用自定义生成器创建对象
这是如何使用 NBuilder 创建和配置具有自定义属性的人员对象的示例:
// 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()
上述代码创建了一个具有自定义属性的新人员对象。 它为人员对象初始化了一个 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()
示例图像

这里 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

示例 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()
这将创建一个 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();
' 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()
示例 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()
在这里,All() 方法确保后续操作应用于内存中创建的所有 10 个 person 对象。 Do() 方法在每个 Person 对象上执行 Action 委托。 此设置从 501 开始按顺序分配 Id 属性,同样地,按顺序将每个人命名为"Person 1"到"Person 10"。

示例 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
这里,Person 类具有几个属性,例如 Id、Name、Email 和 IsMarried,而 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
此单元测试验证了 GetPersonEmail 类的方法能够正确返回具有预期电子邮件地址"Tom@email.com"的 Person 对象的电子邮件地址。 它使用 Arrange-Act-Assert 模式来设置测试数据,执行方法,然后检查实际结果是否与预期结果匹配。
将 NBuilder 与 IronPDF 集成
了解 IronPDF 是一个强大的 C# 库,专为在 .NET 应用程序中从 HTML 创建 PDF而设计。 通过其直观的 API,开发人员可以无缝地将 PDF 功能集成到他们的项目中,无论是正在生成发票、报告还是交互式表单。

安装 IronPDF
打开 NuGet 包管理器控制台,并运行以下命令:
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()
使用 IronPDF 创建 PDF 文档
此代码设置 IronPDF 许可证密钥并从人员对象列表生成 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
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")
ChromePdfRenderer被实例化,用于将存储在 htmlContent 中的 HTML 内容渲染成 PDF 文档。 生成的 PDF 文档被保存到文件系统中,文件名为"PersonList.pdf"。
输出
以下是由 IronPDF 生成的 PersonList 的输出。 它包含五个人,每个人都有默认值。

结论
总之,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生成10个Person对象的列表。
使用NBuilder的一些故障排除技巧是什么?
确保通过NuGet正确安装了NBuilder,并验证您的项目引用是否是最新的。如果您遇到问题,查看NBuilder GitHub存储库或社区论坛可能会提供有用的见解和解决方案。




