跳至页脚内容
.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; }
}
$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
$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();
$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();
$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}");
}
$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();
$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();
$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();
$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;
    }
}
$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);
     }
}
$vbLabelText   $csharpLabel

此单元测试验证PersonService类的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();
$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>";
}
$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");
$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 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 Iron Suite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。