.NET 帮助

NBuilder .NET(它是如何为开发人员工作的)

发布 2024年八月13日
分享:

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
VB   C#

上述命令将安装 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
VB   C#

示例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
VB   C#

图片样本

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()
VB   C#

上述代码创建了一个带有自定义属性的新 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
VB   C#

图片样本

NBuilder .NET(给开发人员的工作原理):图4 - Person对象列表

这里,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
VB   C#

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,
VB   C#

这将创建一个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
VB   C#

示例 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
VB   C#

在此,所有()该方法将应用于对所有 10 个人对象的后续操作,并在内存中创建一个列表。 任务()该方法用于在每个 Person 对象上执行动作委托。

在本例中,它会设置 501 指定的每个人的 Id 属性。lambda 表达式(

)翻译时需要两个参数: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
VB   C#

在此,Person 类具有以下属性,PersonService 只有一个公共方法 GetPersonEmail()返回特定对象的人的电子邮件。

测试类和测试数据

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
VB   C#

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

将 NBuilder 与 IronPDF 相集成

了解 IronPDF是一个功能强大的 C# 库,设计用于从 HTML 创建 PDF在 .NET 应用程序中,您可以使用这些工具。 借助其直观的 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
VB   C#

填充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()
VB   C#

使用 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
VB   C#

IronPdf.License.LicenseKey 设置为特定的许可证密钥,以启用 IronPDF 的功能。

通过对人员列表进行迭代,动态构建 HTML 内容,附加每个人员对象的详细信息(ID, 名称, 电子邮件, 已婚)转换为 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")
VB   C#

ChromePdfRenderer 实例用于将存储在 htmlContent 中的 HTML 内容渲染为 PDF 文档。 生成的 PDF 文档将以 "PersonList.pdf "的名称保存到文件系统中。

输出

以下是 IronPDF 生成的 PersonList 输出。 它包含五个人,每个人都有默认值。

NBuilder .NET(它如何为开发人员工作):图 8 - PDF 输出

结论

总之,NBuilder 是一款强大而灵活的工具,可用于在 .NET 中生成测试数据、简化复杂对象图的创建并提高测试流程的效率。 通过与 IronPDF 集成,开发人员可以轻松扩展其应用程序,使其包括PDF 生成能力对于那些认为这对他们的项目有价值的人。 NBuilder 和 IronPDF 可共同显著增强开发工作流程,使测试和文档生成变得无缝、高效。

< 前一页
Refit C#(为开发者工作原理)
下一步 >
C# TryParse(开发人员如何使用)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >