C#中使用Bogus建立模拟数据

原文:CREATING SAMPLE DATA FOR C#
做者:Bruno Sonnino
译文:C#中使用Bogus建立模拟数据
译者: Lamond Lu数据库

背景

在我每次写技术类博文的时候,常常作的一件事就是建立模拟数据。在每篇博文中,为了解释某些概念,我须要建立许多模拟数据。这是一个我在实际中遇到的问题,由于我须要为个人程序找到一些合适的数据。有些时候,我会从数据库中找一些数据(Northwind和AdventureWorks都是个人好朋友^.^), 有些时候,我会使用一些现成的Json或者Xml数据,固然有时候我只能本身手动建立一些数据。json

固然以上方案都不完美,也都不稳定,因此每次我都须要探索一些新方式来获取数据(对于学习来讲这很好,可是维护起来确是一种灾难)。
最后我找到了Bogus, 一个基于C#的简单数据生成器。c#

使用Bogus生成模拟数据, 你只须要定义规则并生成数据便可,就是这么简单。并且Bogus能够生成固定数据或者变化数据。这样一旦你拿到了这些数据,你就能够把它们序列化成你想要的格式: json, xml,数据库或者文本文件。dom

生成模拟数据

为了生成模拟数据,咱们首先须要针对模拟数据建立对应的实体类。这里咱们能够建立一个命令行程序,并添加一下两个类。单元测试

public class Customer
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
    public string ZipCode { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
    public string ContactName { get; set; }
    public IEnumerable<Order> Orders { get; set; }
}
public class Order
{
    public Guid Id { get; set; }
    public DateTime Date { get; set; }
    public Decimal OrderValue { get; set; }
    public bool Shipped { get; set; }
}

在你建立好以上两个实体类以后,你就能够来添加仓储来获取模拟数据了。为了使用Bogus, 你可使用Nuget将Bogus库添加到你的项目中。学习

Install-Package Bogus测试

下面咱们就能够来添加一个仓储类来获取模拟数据了。这里咱们添加一个SampleCustomerRepository类,并加入如下方法。ui

public IEnumerable<Customer> GetCustomers()
{
    Randomizer.Seed = new Random(123456);
    var ordergenerator = new Faker<Order>()
        .RuleFor(o => o.Id, Guid.NewGuid)
        .RuleFor(o => o.Date, f => f.Date.Past(3))
        .RuleFor(o => o.OrderValue, f => f.Finance.Amount(0, 10000))
        .RuleFor(o => o.Shipped, f => f.Random.Bool(0.9f));
    var customerGenerator = new Faker<Customer>()
        .RuleFor(c => c.Id, Guid.NewGuid())
        .RuleFor(c => c.Name, f => f.Company.CompanyName())
        .RuleFor(c => c.Address, f => f.Address.FullAddress())
        .RuleFor(c => c.City, f => f.Address.City())
        .RuleFor(c => c.Country, f => f.Address.Country())
        .RuleFor(c => c.ZipCode, f => f.Address.ZipCode())
        .RuleFor(c => c.Phone, f => f.Phone.PhoneNumber())
        .RuleFor(c => c.Email, f => f.Internet.Email())
        .RuleFor(c => c.ContactName, (f, c) => f.Name.FullName())
        .RuleFor(c => c.Orders, f => ordergenerator.Generate(f.Random.Number(10)).ToList());
    return customerGenerator.Generate(100);
}

这里的第三行代码,咱们为Randomizer.Seed属性指定一个固定的随机种子,所以每次生成的数据都是同样的。若是你不但愿每次都生成固定的数据,你能够去掉这行代码。命令行

这里咱们为订单和客户数据的生成定义了规则,而后咱们调用了Generate方法来生成模拟数据。就是这么简单。设计

如上所见,Bogus提供了许多类来生成数据。例如Company类能够用来生成公司模拟数据,例如公司名称。你可使用这些生成的数据做为你程序的模拟数据,这些数据有3种使用场景

  • 单元测试的模拟测试数据
  • 设计阶段的模拟数据
  • 原型的模拟数据

可是我确信,你能发现更多的使用场景。

这里为了使用这些数据,你能够在Main方法中加入如下代码

static void Main(string[] args)
{
    var repository = new SampleCustomerRepository();
    var customers = repository.GetCustomers();
    Console.WriteLine(JsonConvert.SerializeObject(customers, 
        Formatting.Indented));
}

这里咱们将模拟数据转换成了Json字符串,因此这里你须要添加对Newtonsoft.Json库的引用。当你运行程序以后,你会得要如下结果。

如上所见,程序生成了一个顾客的数据集,并附带了每一个顾客的全部订单信息。

相关文章
相关标签/搜索