首先声明,Bogus是一个Nuget包的名称,Faker是它内部的一个类,这个库的作用就是模拟生成实体类的数据,特别适合测试时的场景,不用苦思冥想,辛辛苦苦来造不同的实体类了。当然,造出来的都是虚假的(Bogus),骗人的(Faker)。它家在这里:https://github.com/bchavez/Bogus
假如我有个会员类
enum Sex{男,女}class Memmber{public Guid ID { get; set; }public long NO { get; set; }public string Name { get; set; }public Sex Sex { get; set; }public int Age { get; set; }public string Email { get; set; }public string Phone { get; set; }public decimal Balance { get; set; }public DateTime CreateOn { get; set; }}
这个类在测试时,要手动实例化,穿梭于各个层和方法中间,现在把构建这个类的对象(实例),交给Bogus。
首先引入Bogus包
Install-Package Bogus
接下来就可以告诉Faker怎么来“骗人”了
var options = new JsonSerializerOptions();
options.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(UnicodeRanges.All);
while (true)
{var personFaker = new Faker<Memmber>().RuleFor(x => x.ID, x => x.Random.Guid()).RuleFor(x=>x.NO,x=>x.Random.Long(100000000000,999999999999)).RuleFor(x => x.Name, x => x.Person.LastName + x.Person.FirstName).RuleFor(x => x.Sex, x => x.Random.Enum<Sex>()).RuleFor(x => x.Email, x => x.Person.Email).RuleFor(x => x.Phone, x => x.Person.Phone).RuleFor(x => x.Age, x => x.Random.Int(0, 120)).RuleFor(x=>x.Balance,x=>x.Finance.Amount(0,1000)) .RuleFor(x => x.CreateOn, x => x.Date.Past(1));Console.WriteLine(JsonSerializer.Serialize(personFaker.Generate(), options));Console.ReadLine();
}
看一下效果:
{"ID":"5f3d97f6-52da-7fb6-e73f-153fd3a41bfb","NO":539140308276,"Name":"KoeppErick","Sex":0,"Age":48,"Email":"Erick.Koepp@hotmail.com","Phone":"(899) 392-6546","Balance":45.34,"CreateOn":"2021-02-14T13:32:19.892062+09:00"
}
看来,Faker是通过RuleFor来给每个属性来模拟那种格式的数据的,比如RuleFor(x => x.Email, x => x.Person.Email),告诉Faker,这是一个Email格式,记得骗人的时候,给人家一个email格式的数据,内容随便你,那问题来了,是不是有一大组格式呢?当然,这也是这个库的作用,都有哪些?
Bogus API Support
AddressZipCode- Get a zipcode.City- Get a city name.StreetAddress- Get a street address.CityPrefix- Get a city prefix.CitySuffix- Get a city suffix.StreetName- Get a street name.BuildingNumber- Get a building number.StreetSuffix- Get a street suffix.SecondaryAddress- Get a secondary address like 'Apt. 2' or 'Suite 321'.County- Get a county.Country- Get a country.FullAddress- Get a full address like Street, City, Country.CountryCode- Get a random ISO 3166-1 country code.State- Get a random state state.StateAbbr- Get a state abbreviation.Latitude- Get a Latitude.Longitude- Get a Longitude.Direction- Generates a cardinal or ordinal direction. IE: Northwest, South, SW, E.CardinalDirection- Generates a cardinal direction. IE: North, South, E, W.OrdinalDirection- Generates an ordinal direction. IE: Northwest, Southeast, SW, NE.
CommerceDepartment- Get a random commerce department.Price- Get a random product price.Categories- Get random product categories.ProductName- Get a random product name.Color- Get a random color.Product- Get a random product.ProductAdjective- Random product adjective.ProductMaterial- Random product material.Ean8- Get a random EAN-8 barcode number.Ean13- Get a random EAN-13 barcode number.
CompanyCompanySuffix- Get a company suffix. "Inc" and "LLC" etc.CompanyName- Get a company name.CatchPhrase- Get a company catch phrase.Bs- Get a company BS phrase.
DatabaseColumn- Generates a column name.Type- Generates a column type.Collation- Generates a collation.Engine- Generates a storage engine.
DatePast- Get aDateTimein the past betweenrefDateandyearsToGoBack.PastOffset- Get aDateTimeOffsetin the past betweenrefDateandyearsToGoBack.Soon- Get aDateTimethat will happen soon.SoonOffset- Get aDateTimeOffsetthat will happen soon.Future- Get aDateTimein the future betweenrefDateandyearsToGoForward.FutureOffset- Get aDateTimeOffsetin the future betweenrefDateandyearsToGoForward.Between- Get a randomDateTimebetweenstartandend.BetweenOffset- Get a randomDateTimeOffsetbetweenstartandend.Recent- Get a randomDateTimewithin the last few days.RecentOffset- Get a randomDateTimeOffsetwithin the last few days.Timespan- Get a randomTimeSpan.Month- Get a random monthWeekday- Get a random weekday
FinanceAccount- Get an account number. Default length is 8 digits.AccountName- Get an account name. Like "savings", "checking", "Home Loan" etc..Amount- Get a random amount. Default 0 - 1000.TransactionType- Get a transaction type: "deposit", "withdrawal", "payment", or "invoice".Currency- Get a random currency.CreditCardNumber- Generate a random credit card number with valid Luhn checksum.CreditCardCvv- Generate a credit card CVVBitcoinAddress- Generates a random Bitcoin address.EthereumAddress- Generate a random Ethereum address.RoutingNumber- Generates an ABA routing number with valid check digit.Bic- Generates Bank Identifier Code (BIC) code.Iban- Generates an International Bank Account Number (IBAN).
HackerAbbreviation- Returns an abbreviation.Adjective- Returns a adjective.Noun- Returns a noun.Verb- Returns a verb.IngVerb- Returns a verb ending with -ing.Phrase- Returns a phrase.
ImagesAbstract- Gets an abstract looking image.Animals- Gets an image of an animal.Business- Gets a business looking image.Cats- Gets a picture of a cat.City- Gets a city looking image.Food- Gets an image of food.Nightlife- Gets an image with city looking nightlife.Fashion- Gets an image in the fashion category.People- Gets an image of humans.Nature- Gets an image of nature.Sports- Gets an image related to sports.Technics- Get a technology related image.Transport- Get a transportation related image.DataUri- Get a SVG data URI image with a specific width and height.PicsumUrl- Get an image from the https://picsum.photos service.PlaceholderUrl- Get an image from https://placeholder.com service.LoremFlickrUrl- Get an image from https://loremflickr.com service.LoremPixelUrl- Creates an image URL with http://lorempixel.com. Note: This service is slow. Consider using PicsumUrl() as a faster alternative.
InternetAvatar- Generates a legit Internet URL avatar from twitter accounts.Email- Generates an email address.ExampleEmail- Generates an example email with @example.com.UserName- Generates user names.UserNameUnicode- Generates a user name preserving Unicode characters.DomainName- Generates a random domain name.DomainWord- Generates a domain word used for domain names.DomainSuffix- Generates a domain name suffix like .com, .net, .orgIp- Gets a random IPv4 address string.Port- Generates a random port number.IpAddress- Gets a random IPv4 IPAddress type.IpEndPoint- Gets a random IPv4 IPEndPoint.Ipv6- Generates a random IPv6 address string.Ipv6Address- Generate a random IPv6 IPAddress type.Ipv6EndPoint- Gets a random IPv6 IPEndPoint.UserAgent- Generates a random user agent.Mac- Gets a random mac address.Password- Generates a random password.Color- Gets a random aesthetically pleasing color near the base RGB. See here.Protocol- Returns a random protocol. HTTP or HTTPS.Url- Generates a random URL.UrlWithPath- Get an absolute URL with random path.UrlRootedPath- Get a rooted URL path like: /foo/bar. Optionally with file extension.
LoremWord- Get a random lorem word.Words- Get an array of random lorem words.Letter- Get a character letter.Sentence- Get a random sentence of specific number of words.Sentences- Get some sentences.Paragraph- Get a paragraph.Paragraphs- Get a specified number of paragraphs.Text- Get random text on a random lorem methods.Lines- Get lines of lorem.Slug- Slugify lorem words.
NameFirstName- Get a first name. Getting a gender specific name is only supported on locales that support it.LastName- Get a last name. Getting a gender specific name is only supported on locales that support it.FullName- Get a full name, concatenation of calling FirstName and LastName.Prefix- Gets a random prefix for a name.Suffix- Gets a random suffix for a name.FindName- Gets a full name.JobTitle- Gets a random job title.JobDescriptor- Get a job description.JobArea- Get a job area expertise.JobType- Get a type of job.
PhonePhoneNumber- Get a phone number.PhoneNumberFormat- Gets a phone number based on the locale's phone_number.formats[] array index.
RantReview- Generates a random user review.Reviews- Generate an array of random reviews.
SystemFileName- Get a random file name.DirectoryPath- Get a random directory path (Unix).FilePath- Get a random file path (Unix).CommonFileName- Generates a random file name with a common file extension.MimeType- Get a random mime typeCommonFileType- Returns a commonly used file type.CommonFileExt- Returns a commonly used file extension.FileType- Returns any file type available as mime-type.FileExt- Gets a random extension for the given mime type.Semver- Get a random semver version string.Version- Get a randomVersion.Exception- Get a randomExceptionwith a fake stack trace.AndroidId- Get a random GCM registration ID.ApplePushToken- Get a random Apple Push TokenBlackBerryPin- Get a random BlackBerry Device PIN
VehicleVin- Generate a vehicle identification number (VIN).Manufacturer- Get a vehicle manufacture name. IE: Toyota, Ford, Porsche.Model- Get a vehicle model. IE: Camry, Civic, Accord.Type- Get a vehicle type. IE: Minivan, SUV, Sedan.Fuel- Get a vehicle fuel type. IE: Electric, Gasoline, Diesel.
Random/RandomizerNumber- Get an int from 0 to max.Digits- Get a random sequence of digits.Even- Returns a random even number.Odd- Returns a random odd number.Double- Get a random double, between 0.0 and 1.0.Decimal- Get a random decimal, between 0.0 and 1.0.Float- Get a random float, between 0.0 and 1.0.Byte- Generate a random byte between 0 and 255.Bytes- Get a random sequence of bytes.SByte- Generate a random sbyte between -128 and 127.Int- Generate a random int between MinValue and MaxValue.UInt- Generate a random uint between MinValue and MaxValue.ULong- Generate a random ulong between -128 and 127.Long- Generate a random long between MinValue and MaxValue.Short- Generate a random short between MinValue and MaxValue.UShort- Generate a random ushort between MinValue and MaxValue.Char- Generate a random char between MinValue and MaxValue.Chars- Generate a random chars between MinValue and MaxValue.String- Get a string of characters of a specific length.String2- Get a string of characters with a specific length drawing characters fromchars.Hash- Return a random hex hash. Default 40 characters, aka SHA-1.Bool- Get a random boolean.ArrayElement<T>- Get a random array element.ArrayElement- Get a random array element.ArrayElements<T>- Get a random subset of an array.ListItem<T>- Get a random list item.ListItems<T>- Get a random subset of a List.CollectionItem<T>- Get a random collection item.ReplaceNumbers- Replaces symbols with numbers.ReplaceSymbols- Replaces each character instance in a string.Replace- Replaces symbols with numbers and letters. # = number, ? = letter, * = number or letter.ClampString- Clamps the length of a string between min and max characters.Enum<T>- Picks a random Enum of T. Works only with Enums.Shuffle<T>- Shuffles an IEnumerable source.Word- Returns a single word or phrase in English.Words- Gets some random words and phrases in English.WordsArray- Get a range of words in an array (English).Guid- Get a random GUID.Uuid- Get a random GUID. Alias for Randomizer.Guid().RandomLocale- Returns a random locale.AlphaNumeric- Returns a random set of alpha numeric characters 0-9, a-z.Hexadecimal- Generates a random hexadecimal string.WeightedRandom<T>- Returns a selection of T[] based on a weighted distribution of probability.
是不是挺丰富的,一般场景应该够用了,如果有特殊数据模拟,也只能自已动手了。
对,我是一个祖国的程序员,Member类生成的实例是外国的,这不行,换一下:
var options = new JsonSerializerOptions();options.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(UnicodeRanges.All);while (true){var personFaker = new Faker<Memmber>("zh_CN").RuleFor(x => x.ID, x => x.Random.Guid()).RuleFor(x=>x.NO,x=>x.Random.Long(100000000000,999999999999)).RuleFor(x => x.Name, x => x.Person.LastName + x.Person.FirstName).RuleFor(x => x.Sex, x => x.Random.Enum<Sex>()).RuleFor(x => x.Email, x => x.Person.Email).RuleFor(x => x.Phone, x => x.Person.Phone).RuleFor(x => x.Age, x => x.Random.Int(0, 120)).RuleFor(x=>x.Balance,x=>x.Finance.Amount(0,1000)) .RuleFor(x => x.CreateOn, x => x.Date.Past(1));Console.WriteLine(JsonSerializer.Serialize(personFaker.Generate(), options));Console.ReadLine();}
只需要在new Faker<T>时告这个骗子是要骗祖国的程序,就可以了,看结果吧:
{"ID":"219d56ca-ea21-3a02-84b5-d9950ae8f384","NO":362783628351,"Name":"徐思远","Sex":0,"Age":100,"Email":"40@gmail.com","Phone":"024-65735687","Balance":623.22,"CreateOn":"2021-01-19T19:38:30.1504231+09:00"
}
其中的名字还真像个真人名,电话号也换成祖国的了。
那还支持其他国家吗?当然
Locale Code | Language | Locale Code | Language | |
af_ZA | Afrikaans | fr_CH | French (Switzerland) | |
ar | Arabic | ge | Georgian | |
az | Azerbaijani | hr | Hrvatski | |
cz | Czech | id_ID | Indonesia | |
de | German | it | Italian | |
de_AT | German (Austria) | ja | Japanese | |
de_CH | German (Switzerland) | ko | Korean | |
el | Greek | lv | Latvian | |
en | English | nb_NO | Norwegian | |
en_AU | English (Australia) | ne | Nepalese | |
en_AU_ocker | English (Australia Ocker) | nl | Dutch | |
en_BORK | English (Bork) | nl_BE | Dutch (Belgium) | |
en_CA | English (Canada) | pl | Polish | |
en_GB | English (Great Britain) | pt_BR | Portuguese (Brazil) | |
en_IE | English (Ireland) | pt_PT | Portuguese (Portugal) | |
en_IND | English (India) | ro | Romanian | |
en_NG | Nigeria (English) | ru | Russian | |
en_US | English (United States) | sk | Slovakian | |
en_ZA | English (South Africa) | sv | Swedish | |
es | Spanish | tr | Turkish | |
es_MX | Spanish (Mexico) | uk | Ukrainian | |
fa | Farsi | vi | Vietnamese | |
fi | Finnish | zh_CN | Chinese | |
fr | French | zh_TW | Chinese (Taiwan) | |
fr_CA | French (Canada) | zu_ZA | Zulu (South Africa) |
其实还有Bogus有很多其他功能,大家可以自行探索。