跳至页脚内容
.NET 帮助

NBuilder .NET(开发人员如何使用)

NBuilder is a .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 提供了一种动态创建对象的流畅方式。 让我们从一个创建对象的简单示例开始。

这是人员模型类的源代码。

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:创建具有默认值的人员对象

// 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 - 具有值的人员对象

示例 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()
$vbLabelText   $csharpLabel

上述代码创建了一个具有自定义属性的新人员对象。 它为人员对象初始化了一个 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()
$vbLabelText   $csharpLabel

示例图像

NBuilder .NET(开发人员如何使用):图 4 - 人员对象列表

这里 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:创建具有真实随机数据的人员对象列表

为了在人员列表中获得真实的数据值,您可以使用 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:创建具有顺序数据的人员对象列表

有时您可能需要生成具有顺序数据的对象。 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 个人员对象。 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类具有几个属性,如IdNameEmailIsMarried,而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
$vbLabelText   $csharpLabel

此单元测试验证PersonService类的GetPersonEmail方法是否正确返回电子邮件地址为"Tom@email.com"的Person对象。 它使用 Arrange-Act-Assert 模式来设置测试数据,执行方法,然后检查实际结果是否与预期结果匹配。

将 NBuilder 与 IronPDF 集成

Learn About IronPDF is a powerful C# library designed for 从 HTML 创建 PDF而设计。 通过其直观的 API,开发人员可以无缝地将 PDF 功能集成到他们的项目中,无论是正在生成发票、报告还是交互式表单。

NBuilder .NET(开发人员如何使用):图 7 - IronPDF

安装 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()
$vbLabelText   $csharpLabel

使用 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
$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");
' 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的一些故障排除技巧是什么?

确保通过NuGet正确安装了NBuilder,并验证您的项目引用是否是最新的。如果您遇到问题,查看NBuilder GitHub存储库或社区论坛可能会提供有用的见解和解决方案。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。