使用建造者模式创建模拟数据
前言
在寫測試用例時(shí),我們經(jīng)常需要?jiǎng)?chuàng)建模擬數(shù)據(jù),在C#中常用的方式是使用nuget包Bogus。
Bogus可以按照一定規(guī)則生成隨機(jī)數(shù)據(jù),示例代碼如下:
public?class?User {public?string?Name?{?get;?set;?}public?int?Age?{?get;?set;?}public?string?Phone?{?get;?set;?} }//?用戶數(shù)據(jù)生成規(guī)則 var?fakerUser?=?new?Faker<User>()?.RuleFor(p?=>?p.Name,?f?=>?f.Name.FullName())???????????????????????????//?隨機(jī)姓名.RuleFor(p?=>?p.Age,?f?=>?f.Random.Number(1,?100))??????????????????????//?隨機(jī)年齡(1-100歲).RuleFor(p?=>?p.Phone,?p?=>?p.Phone.PhoneNumber("1##########"))?????????//?隨機(jī)手機(jī)號;//?生成測試用戶 var?user?=?fakerUser.Generate();但是,在測試用例中,我只需關(guān)注特定屬性的值,其它屬性有不有值無所謂;而且每個(gè)測試用例關(guān)注的屬性和規(guī)則也不一樣。
這樣就可能導(dǎo)致大量的重復(fù)性模擬數(shù)據(jù)生成代碼。
如何減少這些業(yè)務(wù)邏輯之外代碼的干擾呢?
建造者模式
建造者模式,是將一個(gè)復(fù)雜的對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
在C#中,我們最常用的建造者模式實(shí)現(xiàn)就是StringBuilder:
var?stringBuilder?=?new?StringBuilder(); stringBuilder.AppendLine("Hello"); stringBuilder.AppendFormat("{0}?{1}","My","IO"); var?result?=?stringBuilder.ToString();它通過疊加使用多個(gè)Apend方法,最后組合成需要的字符串。
實(shí)現(xiàn)
利用建設(shè)者模式,我們創(chuàng)建UserBuilder,指定特定屬性的規(guī)則,并生成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();} }現(xiàn)在,代碼是不是更容易理解了:
//關(guān)注的是Phone var?user?=?new?UserBuilder().RuleForPhone("54321########").Build();結(jié)論
使用建造者模式封裝Bogus的使用,可以讓創(chuàng)建模擬數(shù)據(jù)代碼更加干凈清晰!
如果你覺得這篇文章對你有所啟發(fā),請關(guān)注我的個(gè)人公眾號”My IO“
總結(jié)
以上是生活随笔為你收集整理的使用建造者模式创建模拟数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用 C# 判断一个文件是否为程序集
- 下一篇: 真快!10秒内将k8s集群运行起来