使用建造者模式创建模拟数据
前言
在写测试用例时,我们经常需要创建模拟数据,在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“
使用建造者模式创建模拟数据相关推荐
- C#中使用Bogus创建模拟数据
原文:CREATING SAMPLE DATA FOR C#[1] 作者:Bruno Sonnino 译文:C#中使用Bogus创建模拟数据 译者: Lamond Lu 背景 在我每次写技术类博文的时 ...
- 使用建造者模式模拟游戏地图的创建
使用建造者模式模拟游戏地图的创建 换种形式学设计模式,让自己更有兴趣的学设计模式 :) 本文使用了建造者模式创建不同的游戏地图,当然是用控制台模拟的假地图... 1 何为建造者模式 1.1 介绍 建造 ...
- 《设计模式详解》创建型模式 - 建造者模式
建造者模式 4.4 建造者模式 4.4.1 概述 4.4.2 结构 4.4.3 实例 4.4.4 优缺点 4.4.5 使用场景 4.4.6 扩展 - 构建对象 重构前 重构后 4.5 创建型模式对比 ...
- 软件设计模式--第二章 创建型模式--建造者模式
目录 第二章 创建型模式 1.创建型模式概述 2.建造者模式 (1)模式的定义与特点 (2)模式的结构与实现 (3)应用场景 (4)扩展 第二章 创建型模式 1.创建型模式概述 主要特点 将对象的创建 ...
- KEPServerEX 6 模拟数据(OPCUA 通道创建连接)
1. 首先进入界面 2. "连接性" 点击鼠标右键 "新建通道" 3. 选择通道类型为 Simulator ,点击下一步 4. 输入通道的名称(自己起) 5. ...
- 23种设计模式之单例模式、工厂模式、原型模式、建造者模式
系列文章目录 第一章:程序设计原则-单一职责.接口隔离.依赖倒置.里式替换 第二章:程序设计原则-开闭原则.迪米特法则.合成复用原则 文章目录 系列文章目录 一.设计模式简单介绍 1.1.什么是设计模 ...
- 设计模式的C语言应用-建造者模式-第七章
模式介绍 建造者模式将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰.它隔离了复杂产品 对象的创建和使用,使得相同的创建过程能够创建不同的产品.若几个 产品之间存在较大的差异,则不适用 ...
- [设计模式] javascript 之 建造者模式
建造者模式说明 1. 将一个复杂对象的 构造 与它的表示相分离,使同样的创建过程可有不同的表示,这就叫做建造者模式. 2. 面向对象语言中的说明,主要角色: 1>. Builder 这个接口类, ...
- 肝一肝设计模式【四】-- 建造者模式
系列文章目录 肝一肝设计模式[一]-- 单例模式 传送门 肝一肝设计模式[二]-- 工厂模式 传送门 肝一肝设计模式[三]-- 原型模式 传送门 肝一肝设计模式[四]-- 建造者模式 传送门 肝一肝设 ...
最新文章
- 卷积神经网络(CNN)的原理
- “金三银四”跳槽需谨慎(送福利礼包)!
- 《程序出错后,程序员给测试人员的20条高频回复》
- (建议收藏)产品经理要懂的SaaS知识,一文打包给你
- Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析
- 泛函分析1-线性空间
- 服务器维修质保合同,服务器维护保修合同(标准版本).pdf
- 《软件需求分析(第二版)》第 7 章——聆听客户的需求 重点部分总结
- ajax success返回 .net,asp.net-mvc-返回JsonResult的ASP.Net MVC Ajax调用
- html5上传视频和预览,HTML5 上传前预览
- 质数因子 java_质数因子
- list删除重复元素
- Python 语言 Hello world
- mysql语句中出现中文的情况下,在java程序中不会有结果,也不会报错.
- C++ MFC字体设置
- C语言全局变量和局部变量同名时的使用
- 怎么做自媒体,这份入门攻略,建议收藏
- 旋转框目标检测————关于旋转框定义和解决方案
- Java刷题细节知识点汇总——partThree
- 拯救者Y7000 2020新版Bios关闭开机自检
热门文章
- 在IE11下设置SharePoint Server 2013却遇到“需要 Internet Explorer 才能使用此功能。”的解决办法...
- mysql字段使用timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间,类似mssql的getdate()功能;字段自增...
- 2009年最佳80后科技创业者
- 好用的shell工具_精选5个酷毙的Python工具
- ubuntu+php环境下的Memcached 安装方法
- RecycleView弹性滑动
- Docker最全教程——从理论到实战(七)
- Maximum upload size exceede上传文件大小超出解决
- HDU 4777 Rabbit Kingdom 树状数组
- POJ-3635 Full Tank? 变形最短路