.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
Install-Package Nbuilder
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

上述命令将安装 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; }
    }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

示例1:创建具有默认值的Person对象

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 }
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

图片样本

NBuilder .NET(开发人员如何使用):图 3 - 带有值的 Person 对象

示例 2:使用自定义生成器创建对象

以下是如何使用 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();
Dim customPersonBuilder = Builder(Of Person).CreateNew().With(Sub(p) p.Name = "Tom").With(Sub(p) p.Email = "Tom@email.com")
Dim objTom = customPersonBuilder.Build()
$vbLabelText   $csharpLabel

上述代码创建了一个带有自定义属性的新 Person 对象。 它初始化了一个 Person 对象的 customPersonBuilder,将 Name 设置为 "Tom",将 Email 设置为 "Tom@email.com"。 最后,它将构建对象并将其分配给 objTom。

示例3:创建带有默认值的人员对象列表

var personList = Builder<Person>
                                     .CreateListOfSize(10)
                                     .Build();
var personList = Builder<Person>
                                     .CreateListOfSize(10)
                                     .Build();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

图片样本

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

这里,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}, ");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

NBuilder .NET(它如何为开发人员工作):图5 - 自动分配值

示例 4:自定义生成对象

有时您可能需要定制正在创建的对象。 您还可以使用 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,
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()
' 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,
$vbLabelText   $csharpLabel

这将创建一个personList,其默认值为Name = “Kim”,Email = “abc@email.com”,以及IsMarried = false。

例 5:使用真实随机数据创建人对象列表

为了在 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();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

示例 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();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

在这里,All() 方法应用于所有 10 个 person 对象的后续操作,并在内存中创建一个列表。 Do() 方法用于在每个 Person 对象上执行 Action 委托。

在这种情况下,它将每个指定人员的 Id 属性设置为 501。Lambda 表达式 (p, i) 接受两个参数:p 是人,i 是该特定对象在列表中的索引,范围为 (0 到 9),因为列表分别有 10 个对象。 通过在 Id 属性中添加 i 值,属性将从 501 依次设置为 510,Name 属性将设置为 Person 1 至 Person 10。

NBuilder .NET(对开发人员的工作原理):图6 - 顺序数据

示例 7:使用 Xunit 进行单元测试的 NBuilder

.NET 中的 NBuilder 主要用于测试环境,开发人员需要在测试环境中生成一组真实、多样的数据。 它通过复杂的对象使测试变得简单且易于维护,允许开发人员使用 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 具有以下属性,而 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);
     }
}
Public Class PersonTests
	 <Fact>
	 Public Sub GetPersonEmail_ReturnCorrectEmail()
		 ' Arrange
		 Dim service = New PersonService()
		 Dim expectedEmail As String = "Tom@email.com"
		 Dim person = Builder(Of Person).CreateNew().With(Sub(p) p.Name = "Tom").With(Function(p) p.Email "Tom@email.com").Build()
		 ' Act
		 Dim actualEmail = service.GetPersonEmailById(person)
		 ' Assert
		 Assert.Equal(actualEmail, expectedEmail)
	 End Sub
End Class
$vbLabelText   $csharpLabel

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

将 NBuilder 与 IronPDF 相集成

了解 IronPDF 是一个功能强大的 C# 库,专为在 .NET 应用程序中从 HTML 创建 PDF而设计。 借助其直观的 API,开发人员可以将 PDF 功能无缝集成到他们的项目中,无论是生成发票、报告还是交互式表单。

NBuilder .NET(它是如何为开发者工作的):图7 - IronPDF

安装 IronPDF

打开 NuGet 包管理器控制台,运行以下命令:

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
$vbLabelText   $csharpLabel

填充5个Person对象的列表

// 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 许可证密钥,并根据 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 = "Your-License-Key"
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内容,将每个Person对象的详细信息(Id、Name、Email、IsMarried)附加到HTML结构中。

使用 IronPDF 渲染 PDF 文档中的人员名单

此代码使用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");
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 可共同显著增强开发工作流程,使测试和文档生成变得无缝、高效。

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
Refit C#(为开发者工作原理)
下一步 >
C# TryParse(开发人员如何使用)