Hello. I'm your host Brian Chavez (twitter). Bogus is a simple and sane fake data generator for C# and .NET. Bogus is a C# port of faker.js
and inspired by FluentValidation's syntax sugar.
Bogus will help you load databases, UI and apps with fake data for your testing needs. If you like Bogus star ⭐ the repository and show your friends! 😄
Nuget Package Bogus
Install-Package Bogus
Note: .NET Core is supported.
- Elasticsearch .NET Client (NEST) [code]
- RethinkDb.Driver - A RethinkDB database driver.
- .NET Engineering Blog: NuGet Package of the week #1. - "This week in .NET - 12/08/2015"
public enum Gender
{
Male,
Female
}
//Set the randomzier seed if you wish to generate repeatable data sets.
Randomizer.Seed = new Random(3897234);
var fruit = new[] { "apple", "banana", "orange", "strawberry", "kiwi" };
var orderIds = 0;
var testOrders = new Faker<Order>()
//Ensure all properties have rules. By default, StrictMode is false
//Set a global policy by using Faker.DefaultStrictMode
.StrictMode(true)
//OrderId is deterministic
.RuleFor(o => o.OrderId, f => orderIds++)
//Pick some fruit from a basket
.RuleFor(o => o.Item, f => f.PickRandom(fruit))
//A random quantity from 1 to 10
.RuleFor(o => o.Quantity, f => f.Random.Number(1, 10));
var userIds = 0;
var testUsers = new Faker<User>()
//Optional: Call for objects that have complex initialization
.CustomInstantiator(f => new User(userIds++, f.Random.Replace("###-##-####")))
//Basic rules using built-in generators
.RuleFor(u => u.FirstName, f => f.Name.FirstName())
.RuleFor(u => u.LastName, f => f.Name.LastName())
.RuleFor(u => u.Avatar, f => f.Internet.Avatar())
.RuleFor(u => u.UserName, (f, u) => f.Internet.UserName(u.FirstName, u.LastName))
.RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName))
.RuleFor(u => u.SomethingUnique, f => $"Value {f.UniqueIndex}")
.RuleFor(u => u.SomeGuid, Guid.NewGuid)
//Use an enum outside scope.
.RuleFor(u => u.Gender, f => f.PickRandom<Gender>())
//Use a method outside scope.
.RuleFor(u => u.CartId, f => Guid.NewGuid())
//Compound property with context, use the first/last name properties
.RuleFor(u => u.FullName, (f, u) => u.FirstName + " " + u.LastName)
//And composability of a complex collection.
.RuleFor(u => u.Orders, f => testOrders.Generate(3).ToList())
//After all rules are applied finish with the following action
.FinishWith((f, u) =>
{
Console.WriteLine("User Created! Id={0}", u.Id);
});
var user = testUsers.Generate();
Console.WriteLine(user.DumpAsJson());
/* OUTPUT:
User Created! Id=0
*
{
"Id": 0,
"FirstName": "Audrey",
"LastName": "Spencer",
"FullName": "Audrey Spencer",
"UserName": "Audrey_Spencer72",
"Email": "[email protected]",
"Avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/itstotallyamy/128.jpg",
"CartId": "863f9462-5b88-471f-b833-991d68db8c93",
"SSN": "923-88-4231",
"Gender": 0,
"Orders": [
{
"OrderId": 0,
"Item": "orange",
"Quantity": 8
},
{
"OrderId": 1,
"Item": "banana",
"Quantity": 2
},
{
"OrderId": 2,
"Item": "kiwi",
"Quantity": 9
}
]
} */Since we're a port of faker.js, we support a whole bunch of different locales. Here's an example in Korean:
[Test]
public void With_Korean_Locale()
{
var lorem = new Bogus.DataSets.Lorem(locale: "ko");
Console.WriteLine(lorem.Sentence(5));
}
/* 국가는 무상으로 행위로 의무를 구성하지 신체의 처벌받지 예술가의 경우와 */Bogus has support following locales:
| Locale Code | Language |
|---|---|
az |
Azerbaijani |
cz |
Czech |
de |
German |
de_AT |
German (Austria) |
de_CH |
German (Switzerland) |
el |
Greek |
en |
English |
en_AU |
Australia (English) |
en_au_ocker |
Australia Ocker (English) |
en_BORK |
Bork (English) |
en_CA |
Canada (English) |
en_GB |
Great Britain (English) |
en_IE |
Ireland (English) |
en_IND |
India (English) |
en_US |
United States (English) |
es |
Spanish |
es_MX |
Spanish Mexico |
fa |
Farsi |
fr |
French |
fr_CA |
Canada (French) |
ge |
Georgian |
id_ID |
Indonesia |
it |
Italian |
ja |
Japanese |
ko |
Korean |
lv |
Latvian |
nb_NO |
Norwegian |
nep |
Nepalese |
nl |
Dutch |
pl |
Polish |
pt_BR |
Portuguese (Brazil) |
pt_PT |
Portuguese (Portugal) |
ru |
Russian |
sk |
Slovakian |
sv |
Swedish |
tr |
Turkish |
uk |
Ukrainian |
vi |
Vietnamese |
zh_CN |
Chinese |
zh_TW |
Chinese (Taiwan) |
Note: Some locales may not have a complete data set. For example, zh_CN does not have a lorem data set, but ko has a lorem data set. Bogus will default to en if a locale-specific data set is not found. To further illustrate the previous example, the missing zh_CN:lorem data set will default to the en:lorem data set.
If you'd like to help contribute new locales or update existing ones please see our Creating Locales wiki page for more info.
You can use Bogus without a fluent setup. Just use a dataset directly.
[Test]
public void Without_Fluent_Syntax()
{
var random = new Bogus.Randomizer();
var lorem = new Bogus.DataSets.Lorem();
var o = new Order()
{
OrderId = random.Number(1, 100),
Item = lorem.Sentence(),
Quantity = random.Number(1, 10)
};
o.Dump();
}
/* OUTPUT:
{
"OrderId": 61,
"Item": "vel est ipsa",
"Quantity": 7
} */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 the buildingnumberStreetSuffix- Get a street suffix.SecondaryAddress- Get a secondary address like 'Apt. 2' or 'Suite 321'.County- Get a county.Country- Get a country.CountryCode- Get a random country code.State- Get a state.StateAbbr- Get a state abbreviation.Latitude- Get a LatitudeLongitude- Get a Longitude
CommerceDepartment- Get a random commerce department.Price- Get a random product price.Categories- Get random product categoriesProductName- Get a random product name.Color- Get a random color.Product- Get a random product.ProductAdjective- Random product adjective.ProductMaterial- Random product material.
CompanyCompanySuffix- Get a company suffix. "Inc" and "LLC" etc.CompanyName- Get a company nameCompanyName- Get a company name. The format can use any name.* and company.* methods.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 a date in the past between refDate and years past that date.Future- Get a date in the future between refDate and years forward of that date.Between- Get a random date between start and end.Recent- Get a random date/time within the last few days since now.Timespan- Get a random span of time.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- Returns a credit card number that should pass validation. See here.BitcoinAddress- Generates a random bitcoin addressBic- 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 an -ing verb.Phrase- Returns a phrase.
ImagesImage- Gets a random image.Abstract- 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.
InternetAvatar- Generates a legit Internet URL avatar from twitter accounts.Email- Generates an email address.ExampleEmail- Generates an example email with @example.comUserName- Generates user names.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 IP address.Ipv6- Generates a random IPv6 address.UserAgent- Generates a random user agent.Mac- Gets a random mac addressPassword- Generates a random password.Color- Gets a random aesthetically pleasing color near the base R,G.B. See here.Protocol- Returns a random protocol. HTTP or HTTPS.Url- Generates a random URL.
LoremWord- Get a random lorem word.Words- Get some lorem wordsLetter- Get a character letter.Sentence- Get a random sentence of specific number of words.Slug- Slugify lorem words.Sentences- Get some sentences.Paragraph- Get a paragraph.Paragraphs- Get some paragraphs with tabs n all.Text- Get random text on a random lorem methods.Lines- Get lines of lorem
NameFirstName- Get a first name. Getting a gender specific name is only supported on locales that support it. Example, 'ru' supports male/female names, but not 'en' English.LastName- Get a first name. Getting a gender specific name is only supported on locales that support it. Example, Russian ('ru') supports male/female names, but English ('en') does not.Prefix- Gets a random prefix for a nameSuffix- Gets a random suffix for a nameFindName- Gets a full nameJobTitle- Gets a random job title.JobDescriptor- Get a job description.JobArea- Get a job area expertise.JobType- Get a type of job.
PhoneNumbersPhoneNumber- Get a phone number.PhoneNumberFormat- Gets a phone number via format array index as defined in a locale's phone_number.formats[] array.
SystemFileName- Get a random file nameMimeType- Get a random mime typeCommonFileType- Returns a commonly used file typeCommonFileExt- Returns a commonly used file extensionFileType- Returns any file type available as mime-typeFileExt- Gets a random extension for the given mime type.Semver- Get a random semver version string.Version- Get a randomSystem.VersionException- Get a randomExceptionwith a fake stack trace.
If you want to generate a Person with context relevant properties like
an email that looks like it belongs to someone with the same first/last name,
create a person!
[Test]
public void Create_Context_Related_Person()
{
var person = new Bogus.Person();
person.Dump();
}
/* OUTPUT:
{
"FirstName": "Lee",
"LastName": "Brown",
"UserName": "Lee_Brown3",
"Avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/ccinojasso1/128.jpg",
"Email": "[email protected]",
"DateOfBirth": "1984-01-16T21:31:27.87666",
"Address": {
"Street": "2552 Bernard Rapid",
"Suite": "Suite 199",
"City": "New Haskell side",
"ZipCode": "78425-0411",
"Geo": {
"Lat": -35.8154,
"Lng": -140.2044
}
},
"Phone": "1-500-790-8836 x5069",
"Website": "javier.biz",
"Company": {
"Name": "Kuphal and Sons",
"CatchPhrase": "Organic even-keeled monitoring",
"Bs": "open-source brand e-business"
}
} */Replace a formatted string with random numbers #, letters ?, or * random number or letter:
[Test]
public void Create_an_SSN()
{
var ssn = new Bogus.Randomizer().Replace("###-##-####");
ssn.Dump();
var code = new Randomizer().Replace("##? ??? ####");
code.Dump();
var serial = new Randomizer().Replace("**-****");
code.Dump();
}
/* OUTPUT:
"618-19-3064"
"39E SPC 0790"
"L3-J9N5"
*/You can also parse strings in the following format:
[Test]
public void Handlebar()
{
var faker = new Faker();
var randomName = faker.Parse("{{name.lastName}}, {{name.firstName}} {{name.suffix}}");
randomName.Dump();
}
/* OUTPUT:
"Roob, Michale PhD"
*/You can also use implicit type conversion to make your code look cleaner without having to explicitly call Faker<T>.Generate().
var orderFaker = new Faker<Order>()
.RuleFor(o => o.OrderId, f => f.IndexVariable++)
.RuleFor(o => o.Item, f => f.Commerce.Product())
.RuleFor(o => o.Quantity, f => f.Random.Number(1,3));
Order testOrder1 = orderFaker;
Order testOrder2 = orderFaker;
testOrder1.Dump();
testOrder2.Dump();
/* OUTPUT:
{
"OrderId": 0,
"Item": "Computer",
"Quantity": 2
}
{
"OrderId": 1,
"Item": "Tuna",
"Quantity": 3
}
*/
//Explicit works too!
var anotherOrder = (Order)orderFaker;- Download the source code.
- Run
build.cmd.
Upon successful build, the results will be in the \__compile directory.
The build.cmd compiles the C# code and embeds the locales in Source\Bogus\data.
If you want to rebuild the NuGet packages run build.cmd pack and the NuGet
packages will be in __package.
If you wish to re-bundle the latest faker.js locales, you'll need to first:
git submodule initgit submodule update- Ensure, NodeJS and
gulpare properly installed. cd Source\Buildernpm installto install required dev dependencies.gulp build.localesto regenerate locales inSource\Bogus\data.- In solution explorer add any new locales not already included as an
EmbeddedResource. - Finally, run
build.bat.
Created by Brian Chavez.
faker.js made possible by Matthew Bergman & Marak Squires.
A big thanks to GitHub and all contributors:

