The reason for generating fake data can be anything. But, the most common use case I think for generating fake data is when someone is dependent on the result from your API.
As a backend developer, you’ve to just create a model and return a few fake objects that represent data.
We could however create a new object of the new model but what if we’ve to do it for several models and multiple API endpoints. This will be tiresome to do it yourself.
Let’s say we have an API that should return a customer object when provided with an id of the customer.
Here is our customer model.
public class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public string Bio { get; set; } public Address Address { get; set; } } public class Address { public string Line1 { get; set; } public string Line2 { get; set; } public string PinCode { get; set; } }
Now, if we want to generate fake data we will have to set some random text to our string types and a number to the integer type.
I think it’s time to find a fake/dummy data generator.
Bogus is one such fake data generator for C#, F#, and VB.NET. It is inspired by faker.js (a popular library for creating fake data in JavaScript).
Currently Bogus supports
Install Bogus from Nuget with the following command
Install-Package Bogus
Faker
class..Generate()
method on the Faker object to generate some random data. That’s it!Ex:
var data = new Faker<T>(); var output = data.Generate();
Let’s see how the Bogus generates data for us without assigning any rules for the Faker object.
Here is my Main
method code.
class Program { static void Main(string[] args) { var customer = new Faker<Customer>(); Console.WriteLine(customer.Generate().Dump()); } }
Note: the Dump
is an extension method that I’ve created which takes any object and serializes the object to JSON with indentation.
And here is the output of the above code
{ "Id": 0, "FirstName": null, "LastName": null, "Email": null, "Bio": null, "Address": null }
With no rules for data, we can see the Bogus returned object properties with default values for the types.
Let’s write rules for all of our fields and see how the test data is generated
var address = new Faker<Address>() .RuleFor(a => a.Line1, f => f.Address.BuildingNumber()) .RuleFor(a => a.Line2, f => f.Address.StreetAddress()) .RuleFor(a => a.PinCode, f => f.Address.ZipCode()) ; var customer = new Faker<Customer>() .RuleFor(c => c.Id, f => f.Random.Number(1, 100)) .RuleFor(c => c.FirstName, f => f.Person.FirstName) .RuleFor(c => c.LastName, f => f.Person.LastName) .RuleFor(c => c.Email, f => f.Person.Email) .RuleFor(c => c.Bio, f => f.Lorem.Paragraph(1)) .RuleFor(c => c.Address, f => address.Generate()) ; Console.WriteLine(customer.Generate().Dump());
Notice how we created rules for fields. Also observe Address, Person, Random, Lorem
these are supported by Bogus API itself so that we can create the context based fake data instead of generating random text for the fields.
And here is the output.
{ "Id": 61, "FirstName": "Erica", "LastName": "Tremblay", "Email": "Erica38@gmail.com", "Bio": "Impedit est dicta ad. Magnam molestiae debitis nemo recusandae dolor aut alias.", "Address": { "Line1": "61934", "Line2": "140 Angela Flats", "PinCode": "27723-1415" } }
This looks great!
Let’s say we want to generate data by type and not for every field. Let’s see how we can do it.
var address = new Faker<Address>() .RuleForType(typeof(string), c => c.Random.AlphaNumeric(50)) ; var customer = new Faker<Customer>() .RuleForType(typeof(string), c => c.Random.Word()) .RuleForType(typeof(int), c => c.Random.Number(10, 20)) .RuleFor(c => c.Email, f => f.Person.Email) .RuleFor(c => c.Address, f => address.Generate()) ; Console.WriteLine(customer.Generate().Dump());
Here’s the output
{ "Id": 20, "FirstName": "Aruba", "LastName": "data-warehouse", "Email": "Francisco_Haag19@yahoo.com", "Bio": "Markets", "Address": { "Line1": "2scvd7yl26uxpp28nr9k6aizk8sishmohliglkgsi3v4ykvt0y", "Line2": "4cntrrada4egtkj6g37mn3ag12fd10czhtda0ntr689cd2aaks", "PinCode": "3smdb016sobwcasfy0795safgfuy3ys4s9wkd4hc8tv4f9vyjy" } }
Although the strings for Address
fields are not readable, we can see how we got random string with alpha numeric characters for address fields.
Notice how the above customer query is built.
var customer = new Faker<Customer>() .RuleForType(typeof(string), c => c.Random.Word()) .RuleForType(typeof(int), c => c.Random.Number(10, 20)) .RuleFor(c => c.Email, f => f.Person.Email) .RuleFor(c => c.Address, f => address.Generate()) ;
Though we set up all the string types to use Random.Word()
method to generate a random word we still got an Email address in the output because of the next rule for the Email
field
.RuleFor(c => c.Email, f => f.Person.Email)
So, if we’ve moved the email rule to the top and have the RuleForType
string at the end. Then all the strings would’ve generated random words including the email field.
var customer = new Faker<Customer>(); var customerList = customer.Generate(3);
Passing the number of items to create in the collection will produce List<Customer>
object.
Bogus also provides non-Fluent syntax so you can create a Faker object without providing any class type and generate the fake data. Here’s an example of how we can do it.
Var faker = new Faker("en"); Var email = faker.Person.Email;
This is the .Dump()
method used to serialize the object to produce JSON in this blog post.
using Newtonsoft.Json; public static string Dump(this object obj) { return JsonConvert.SerializeObject(obj, Formatting.Indented); }
Karthik is a passionate Full Stack developer working primarily on .NET Core, microservices, distributed systems, VUE and JavaScript. He also loves NBA basketball so you might find some NBA examples in his posts and he owns this blog.
In this post, we’ll see how to test gRPC Server applications using different clients. And… Read More
In this post, we'll create a new gRPC project in ASP.NET Core and see what's… Read More
In this blog post, we’ll see how to run dotnet core projects without opening visual… Read More
Programmatically evaluating policies is useful when we want to provide access or hide some data… Read More
We saw how we could set up policy-based authorization in our previous article. In this… Read More
What is policy-based authorization and how to set up policy-based authorization with handlers and policies… Read More
This website uses cookies.