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

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

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 个 person 对象。 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

此单元测试验证了 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 个人员对象的列表

// 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存储库或社区论坛可能会提供有用的见解和解决方案。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

Jacob 拥有曼彻斯特大学土木工程一级荣誉工程学士学位(BEng)(1998-2001 年)。他的旗舰产品 IronPDF 和 Iron Suite for .NET 库在全球的 NuGet 安装量已超过 3000 万次,其基础代码继续为全球使用的开发人员工具提供动力。Jacob 拥有 25 年的商业经验和 41 年的编码专业知识,他一直专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我