编辑
2025-02-08
C# 应用
00
请注意,本文编写于 119 天前,最后修改于 119 天前,其中某些信息可能已经过时。

目录

1. 安装
2. 基本用法
2.1 生成简单的假数据
2.2 生成特定类型的数据
3. 生成自定义对象
3.1 简单对象
3.2 生成多个对象
3.3 复杂对象
4. 高级用法
4.1 使用 Seed 值
4.2 本地化
4.3 自定义数据源
4.4 条件规则
5. 结论

Bogus 是一个简单yet功能强大的 C# 库,用于生成逼真的假数据。无论是在测试、原型设计还是演示中,Bogus 都能帮助你快速生成所需的模拟数据。本文将详细介绍 Bogus 的使用方法,并提供多个实用的例子。

1. 安装

首先,通过 NuGet 包管理器安装 Bogus:

C#
Install-Package Bogus

image.png

2. 基本用法

2.1 生成简单的假数据

让我们从一个简单的例子开始,生成一个假人的信息:

C#
using Bogus; class Program { static void Main(string[] args) { var faker = new Faker(); Console.WriteLine($"Name: {faker.Name.FullName()}"); Console.WriteLine($"Email: {faker.Internet.Email()}"); Console.WriteLine($"Phone: {faker.Phone.PhoneNumber()}"); Console.WriteLine($"Address: {faker.Address.FullAddress()}"); } }

image.png

JavaScript
var faker = new Faker("zh_CN");

image.png

2.2 生成特定类型的数据

Bogus 提供了多种类型的假数据生成器:

C#
var faker = new Faker(); Console.WriteLine($"Company: {faker.Company.CompanyName()}"); Console.WriteLine($"Catch Phrase: {faker.Company.CatchPhrase()}"); Console.WriteLine($"BS: {faker.Company.Bs()}"); Console.WriteLine($"Product: {faker.Commerce.Product()}"); Console.WriteLine($"Price: {faker.Commerce.Price()}"); Console.WriteLine($"Credit Card: {faker.Finance.CreditCardNumber()}"); Console.WriteLine($"Bitcoin Address: {faker.Finance.BitcoinAddress()}"); Console.WriteLine($"User Agent: {faker.Internet.UserAgent()}"); Console.WriteLine($"Color: {faker.Commerce.Color()}"); Console.WriteLine($"Time Zone: {faker.Date.TimeZoneString()}");

image.png

3. 生成自定义对象

Bogus 最强大的功能之一是能够生成自定义对象的假数据。

3.1 简单对象

假设我们有一个 User 类:

C#
public class User { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public DateTime DateOfBirth { get; set; } }

我们可以这样生成假用户数据:

C#
var faker = new Faker<User>() .RuleFor(u => u.Id, f => f.Random.Int(1, 100)) .RuleFor(u => u.FirstName, f => f.Name.FirstName()) .RuleFor(u => u.LastName, f => f.Name.LastName()) .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName)) .RuleFor(u => u.DateOfBirth, f => f.Date.Past(50)); User user = faker.Generate(); Console.WriteLine($"Id: {user.Id}"); Console.WriteLine($"Name: {user.FirstName} {user.LastName}"); Console.WriteLine($"Email: {user.Email}"); Console.WriteLine($"Date of Birth: {user.DateOfBirth:d}");

image.png

3.2 生成多个对象

生成一个包含多个用户的列表:

C#
var faker = new Faker<User>() .RuleFor(u => u.Id, f => f.Random.Int(1, 100)) .RuleFor(u => u.FirstName, f => f.Name.FirstName()) .RuleFor(u => u.LastName, f => f.Name.LastName()) .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName)) .RuleFor(u => u.DateOfBirth, f => f.Date.Past(50)); List<User> users = faker.Generate(10); foreach (var user in users) { Console.WriteLine($"{user.FirstName} {user.LastName} ({user.Email})"); }

image.png

3.3 复杂对象

假设我们有一个更复杂的 Order 类:

C#
public class OrderItem { public string ProductName { get; set; } public int Quantity { get; set; } public decimal Price { get; set; } } public class Order { public int Id { get; set; } public User Customer { get; set; } public DateTime OrderDate { get; set; } public List<OrderItem> Items { get; set; } public decimal TotalAmount { get; set; } }

我们可以这样生成假订单数据:

TypeScript
var userFaker = new Faker<User>() .RuleFor(u => u.Id, f => f.Random.Int(1, 100)) .RuleFor(u => u.FirstName, f => f.Name.FirstName()) .RuleFor(u => u.LastName, f => f.Name.LastName()) .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName)); var orderItemFaker = new Faker<OrderItem>() .RuleFor(oi => oi.ProductName, f => f.Commerce.ProductName()) .RuleFor(oi => oi.Quantity, f => f.Random.Int(1, 10)) .RuleFor(oi => oi.Price, f => decimal.Parse(f.Commerce.Price())); var orderFaker = new Faker<Order>() .RuleFor(o => o.Id, f => f.Random.Int(1000, 9999)) .RuleFor(o => o.Customer, f => userFaker.Generate()) .RuleFor(o => o.OrderDate, f => f.Date.Recent(30)) .RuleFor(o => o.Items, f => orderItemFaker.Generate(f.Random.Int(1, 5))) .RuleFor(o => o.TotalAmount, (f, o) => o.Items.Sum(i => i.Price * i.Quantity)); Order order = orderFaker.Generate(); Console.WriteLine($"Order ID: {order.Id}"); Console.WriteLine($"Customer: {order.Customer.FirstName} {order.Customer.LastName}"); Console.WriteLine($"Order Date: {order.OrderDate:d}"); Console.WriteLine("Items:"); foreach (var item in order.Items) { Console.WriteLine($" {item.ProductName} - Quantity: {item.Quantity}, Price: {item.Price:C}"); } Console.WriteLine($"Total Amount: {order.TotalAmount:C}");

image.png

4. 高级用法

4.1 使用 Seed 值

使用 Seed 值可以确保每次生成相同的假数据:

C#
var faker = new Faker("zh_CN"); faker.Random = new Randomizer(12345); Console.WriteLine(faker.Name.FullName()); // 每次运行都会生成相同的名字

image.png

4.2 本地化

Bogus 支持多种语言的本地化:

C#
var fakerEs = new Faker("es"); Console.WriteLine($"Spanish name: {fakerEs.Name.FullName()}"); var fakerDe = new Faker("de"); Console.WriteLine($"German address: {fakerDe.Address.FullAddress()}"); var fakerFr = new Faker("fr"); Console.WriteLine($"French phone number: {fakerFr.Phone.PhoneNumber()}");

image.png

4.3 自定义数据源

你可以创建自己的数据源:

C#
public class CustomDataSource : DataSet { public CustomDataSource() { Fruits = new[] { "Apple", "Banana", "Cherry", "Date", "Elderberry" }; Random = new Random(); } public string[] Fruits { get; set; } public Random Random { get; set; } public string GetRandomFruit() { return Fruits[Random.Next(0, Fruits.Length)]; } }
C#
var faker = new Faker<CustomDataSource>(); faker.CustomInstantiator(f => new CustomDataSource()); var customData = faker.Generate(); Console.WriteLine($"Random fruit: {customData.GetRandomFruit()}");

image.png

4.4 条件规则

你可以根据条件应用不同的规则:

C#
var userFaker = new Faker<User>() .RuleFor(u => u.Id, f => f.Random.Int(1, 100)) .RuleFor(u => u.FirstName, f => f.Name.FirstName()) .RuleFor(u => u.LastName, f => f.Name.LastName()) .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName)) .RuleFor(u => u.DateOfBirth, f => f.Date.Past(50)) .RuleSet("adult", set => { set.RuleFor(u => u.DateOfBirth, f => f.Date.Past(50, DateTime.Now.AddYears(-18))); }); var adultUser = userFaker.Generate(1, "adult").First(); Console.WriteLine($"Adult user: {adultUser.FirstName} {adultUser.LastName}, Born: {adultUser.DateOfBirth:d}");

image.png

5. 结论

Bogus 是一个非常强大和灵活的假数据生成库。它不仅可以生成各种类型的基本数据,还可以创建复杂的对象结构。无论是在单元测试、UI 原型设计还是演示数据准备中,Bogus 都能大大提高你的工作效率。

通过本文提供的示例,你应该能够处理大多数需要生成假数据的场景。从简单的字符串和数字到复杂的对象图,Bogus 都能轻松应对。它的本地化支持和可扩展性使其成为 .NET 开发者工具箱中不可或缺的工具。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!