前言

在写测试用例时,我们经常需要创建模拟数据,在C#中常用的方式是使用nuget包Bogus

Bogus可以按照一定规则生成随机数据,示例代码如下:

public class User
{public string Name { get; set; }public int Age { get; set; }public string Phone { get; set; }
}// 用户数据生成规则
var fakerUser = new Faker<User>() .RuleFor(p => p.Name, f => f.Name.FullName())                           // 随机姓名.RuleFor(p => p.Age, f => f.Random.Number(1, 100))                      // 随机年龄(1-100岁).RuleFor(p => p.Phone, p => p.Phone.PhoneNumber("1##########"))         // 随机手机号;// 生成测试用户
var user = fakerUser.Generate();

但是,在测试用例中,我只需关注特定属性的值,其它属性有不有值无所谓;而且每个测试用例关注的属性和规则也不一样。

这样就可能导致大量的重复性模拟数据生成代码。

如何减少这些业务逻辑之外代码的干扰呢?

建造者模式

建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

在C#中,我们最常用的建造者模式实现就是StringBuilder:

var stringBuilder = new StringBuilder();
stringBuilder.AppendLine("Hello");
stringBuilder.AppendFormat("{0} {1}","My","IO");
var result = stringBuilder.ToString();

它通过叠加使用多个Apend方法,最后组合成需要的字符串。

实现

利用建设者模式,我们创建UserBuilder,指定特定属性的规则,并生成User对象,而无需明确指定所有这些属性:

public class UserBuilder
{private readonly Faker<User> _fakerUser = new Faker<User>().RuleFor(p => p.Name, f => f.Name.FullName()) .RuleFor(p => p.Age, f => f.Random.Number(1, 100)) .RuleFor(p => p.Phone, p => p.Phone.PhoneNumber("1##########")); public UserBuilder RuleForAge(int min, int max){_fakerUser.RuleFor(p => p.Age, f => f.Random.Number(min, max));return this;}public UserBuilder RuleForPhone(string format){_fakerUser.RuleFor(p => p.Phone, p => p.Phone.PhoneNumber(format));return this;}public User Build(){return _fakerUser.Generate();}
}

现在,代码是不是更容易理解了:

//关注的是Phone
var user = new UserBuilder().RuleForPhone("54321########").Build();

结论

使用建造者模式封装Bogus的使用,可以让创建模拟数据代码更加干净清晰!

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

使用建造者模式创建模拟数据相关推荐

  1. C#中使用Bogus创建模拟数据

    原文:CREATING SAMPLE DATA FOR C#[1] 作者:Bruno Sonnino 译文:C#中使用Bogus创建模拟数据 译者: Lamond Lu 背景 在我每次写技术类博文的时 ...

  2. 使用建造者模式模拟游戏地图的创建

    使用建造者模式模拟游戏地图的创建 换种形式学设计模式,让自己更有兴趣的学设计模式 :) 本文使用了建造者模式创建不同的游戏地图,当然是用控制台模拟的假地图... 1 何为建造者模式 1.1 介绍 建造 ...

  3. 《设计模式详解》创建型模式 - 建造者模式

    建造者模式 4.4 建造者模式 4.4.1 概述 4.4.2 结构 4.4.3 实例 4.4.4 优缺点 4.4.5 使用场景 4.4.6 扩展 - 构建对象 重构前 重构后 4.5 创建型模式对比 ...

  4. 软件设计模式--第二章 创建型模式--建造者模式

    目录 第二章 创建型模式 1.创建型模式概述 2.建造者模式 (1)模式的定义与特点 (2)模式的结构与实现 (3)应用场景 (4)扩展 第二章 创建型模式 1.创建型模式概述 主要特点 将对象的创建 ...

  5. KEPServerEX 6 模拟数据(OPCUA 通道创建连接)

    1. 首先进入界面 2. "连接性" 点击鼠标右键 "新建通道" 3. 选择通道类型为 Simulator ,点击下一步 4. 输入通道的名称(自己起) 5. ...

  6. 23种设计模式之单例模式、工厂模式、原型模式、建造者模式

    系列文章目录 第一章:程序设计原则-单一职责.接口隔离.依赖倒置.里式替换 第二章:程序设计原则-开闭原则.迪米特法则.合成复用原则 文章目录 系列文章目录 一.设计模式简单介绍 1.1.什么是设计模 ...

  7. 设计模式的C语言应用-建造者模式-第七章

    模式介绍 建造者模式将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰.它隔离了复杂产品 对象的创建和使用,使得相同的创建过程能够创建不同的产品.若几个 产品之间存在较大的差异,则不适用 ...

  8. [设计模式] javascript 之 建造者模式

    建造者模式说明 1. 将一个复杂对象的 构造 与它的表示相分离,使同样的创建过程可有不同的表示,这就叫做建造者模式. 2. 面向对象语言中的说明,主要角色: 1>. Builder 这个接口类, ...

  9. 肝一肝设计模式【四】-- 建造者模式

    系列文章目录 肝一肝设计模式[一]-- 单例模式 传送门 肝一肝设计模式[二]-- 工厂模式 传送门 肝一肝设计模式[三]-- 原型模式 传送门 肝一肝设计模式[四]-- 建造者模式 传送门 肝一肝设 ...

最新文章

  1. 卷积神经网络(CNN)的原理
  2. “金三银四”跳槽需谨慎(送福利礼包)!
  3. 《程序出错后,程序员给测试人员的20条高频回复》
  4. (建议收藏)产品经理要懂的SaaS知识,一文打包给你
  5. Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析
  6. 泛函分析1-线性空间
  7. 服务器维修质保合同,服务器维护保修合同(标准版本).pdf
  8. 《软件需求分析(第二版)》第 7 章——聆听客户的需求 重点部分总结
  9. ajax success返回 .net,asp.net-mvc-返回JsonResult的ASP.Net MVC Ajax调用
  10. html5上传视频和预览,HTML5 上传前预览
  11. 质数因子 java_质数因子
  12. list删除重复元素
  13. Python 语言 Hello world
  14. mysql语句中出现中文的情况下,在java程序中不会有结果,也不会报错.
  15. C++ MFC字体设置
  16. C语言全局变量和局部变量同名时的使用
  17. 怎么做自媒体,这份入门攻略,建议收藏
  18. 旋转框目标检测————关于旋转框定义和解决方案
  19. Java刷题细节知识点汇总——partThree
  20. 拯救者Y7000 2020新版Bios关闭开机自检

热门文章

  1. 在IE11下设置SharePoint Server 2013却遇到“需要 Internet Explorer 才能使用此功能。”的解决办法...
  2. mysql字段使用timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间,类似mssql的getdate()功能;字段自增...
  3. 2009年最佳80后科技创业者
  4. 好用的shell工具_精选5个酷毙的Python工具
  5. ubuntu+php环境下的Memcached 安装方法
  6. RecycleView弹性滑动
  7. Docker最全教程——从理论到实战(七)
  8. Maximum upload size exceede上传文件大小超出解决
  9. HDU 4777 Rabbit Kingdom 树状数组
  10. POJ-3635 Full Tank? 变形最短路