Skip to content

Commit 82d8def

Browse files
Bogus in C#: net10.0, UseSeeding, seeded generator, email test fix (#2300)
* Bogus: net10.0, UseSeeding instead of HasData, Migrate, seeded generator, email test fix Retarget both projects to net10.0 (Bogus 35.6.5, EF Core 10.0.13, direct System.Security.Cryptography.Pkcs 10.0.13 for the SqlClient advisory; xunit 2.9.3, runner 4.0.1, Test SDK 18.11.0, coverlet 10.1.0). EmployeeContext seeds through UseSeeding() in OnConfiguring(); OnModelCreating() and HasData() removed. GetSeededEmployeesFromDb() calls Migrate() instead of EnsureCreated(); the employee generator keeps its Vehicles rule. Add GenerateRepeatableVehicles(int seed) and a test that the same seed gives the same vehicles. The email test asserts StartsWith(FirstName): Bogus does not always use the last name. * Bogus: email test compares against the slugified first name Bogus slugifies the name when it builds the email (D'angelo becomes Dangelo), so StartsWith(FirstName) failed about 2 to 3 times in 10,000 runs. The test now asserts StartsWith(Utils.Slugify(FirstName)); 10,000 probe runs give 0 failures.
1 parent 174bb2e commit 82d8def

5 files changed

Lines changed: 55 additions & 28 deletions

File tree

‎dotnet-client-libraries/BogusNugetPackage/BogusNugetPackage/BogusNugetPackage.csproj‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net7.0</TargetFramework>
5+
<TargetFramework>net10.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Bogus" Version="34.0.2" />
12-
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.1" />
13-
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.1">
11+
<PackageReference Include="Bogus" Version="35.6.5" />
12+
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.13" />
13+
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.13">
1414
<PrivateAssets>all</PrivateAssets>
1515
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1616
</PackageReference>
17-
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.1" />
17+
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.13" />
18+
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="10.0.13" />
1819
</ItemGroup>
1920

2021
</Project>

‎dotnet-client-libraries/BogusNugetPackage/BogusNugetPackage/DataGenerator.cs‎

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
namespace BogusNugetPackage;
88
public static class DataGenerator
99
{
10-
public static readonly List<Employee> Employees = new();
11-
public static readonly List<Vehicle> Vehicles = new();
10+
public static readonly List<Employee> Employees = [];
11+
public static readonly List<Vehicle> Vehicles = [];
1212

1313
public const int NumberOfEmployees = 5;
1414
public const int NumberOfVehiclesPerEmployee = 2;
@@ -17,7 +17,7 @@ public static List<Employee> GetSeededEmployeesFromDb()
1717
{
1818
using var employeeDbContext = new EmployeeContext();
1919

20-
employeeDbContext.Database.EnsureCreated();
20+
employeeDbContext.Database.Migrate();
2121

2222
var dbEmployeesWithVehicles = employeeDbContext.Employees
2323
.Include(e => e.Vehicles)
@@ -31,14 +31,23 @@ public static void InitBogusData()
3131
var employeeGenerator = GetEmployeeGenerator();
3232
var generatedEmployees = employeeGenerator.Generate(NumberOfEmployees);
3333
Employees.AddRange(generatedEmployees);
34-
generatedEmployees.ForEach(e => Vehicles.AddRange(GetBogusVehicleData(e.Id)));
34+
}
35+
36+
public static List<Vehicle> GenerateRepeatableVehicles(int seed)
37+
{
38+
return new Faker<Vehicle>()
39+
.UseSeed(seed)
40+
.RuleFor(v => v.Id, f => f.Random.Guid())
41+
.RuleFor(v => v.Manufacturer, f => f.Vehicle.Manufacturer())
42+
.RuleFor(v => v.Fuel, f => f.Vehicle.Fuel())
43+
.Generate(NumberOfVehiclesPerEmployee);
3544
}
3645

3746
private static List<Vehicle> GetBogusVehicleData(Guid employeeId)
3847
{
3948
var vehicleGenerator = GetVehicleGenerator(employeeId);
4049
var generatedVehicles = vehicleGenerator.Generate(NumberOfVehiclesPerEmployee);
41-
50+
Vehicles.AddRange(generatedVehicles);
4251
return generatedVehicles;
4352
}
4453

@@ -52,7 +61,11 @@ private static Faker<Employee> GetEmployeeGenerator()
5261
.RuleFor(e => e.Email, (f, e) => f.Internet.Email(e.FirstName, e.LastName))
5362
.RuleFor(e => e.AboutMe, f => f.Lorem.Paragraph(1))
5463
.RuleFor(e => e.YearsOld, f => f.Random.Int(18, 90))
55-
.RuleFor(e => e.Personality, f => f.PickRandom<Personality>());
64+
.RuleFor(e => e.Personality, f => f.PickRandom<Personality>())
65+
.RuleFor(e => e.Vehicles, (_, e) =>
66+
{
67+
return GetBogusVehicleData(e.Id);
68+
});
5669
}
5770

5871
private static Faker<Vehicle> GetVehicleGenerator(Guid employeeId)

‎dotnet-client-libraries/BogusNugetPackage/BogusNugetPackage/Database/EmployeeContext.cs‎

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,17 @@ public sealed class EmployeeContext : DbContext
99

1010
protected override void OnConfiguring(DbContextOptionsBuilder options)
1111
{
12-
options.UseSqlServer("Server=localhost;Database=EmployeeDb;Trusted_Connection=True;MultipleActiveResultSets=True;TrustServerCertificate=True");
13-
options.EnableSensitiveDataLogging();
14-
}
12+
options.UseSqlServer("Server=localhost;Database=EmployeeDb;Trusted_Connection=True;MultipleActiveResultSets=True;TrustServerCertificate=True")
13+
.UseSeeding((context, _) =>
14+
{
15+
if (context.Set<Employee>().Any())
16+
{
17+
return;
18+
}
1519

16-
protected override void OnModelCreating(ModelBuilder modelBuilder)
17-
{
18-
base.OnModelCreating(modelBuilder);
19-
20-
modelBuilder.Entity<Employee>().HasData(DataGenerator.Employees);
21-
modelBuilder.Entity<Vehicle>().HasData(DataGenerator.Vehicles);
20+
context.Set<Employee>().AddRange(DataGenerator.Employees);
21+
context.SaveChanges();
22+
});
23+
options.EnableSensitiveDataLogging();
2224
}
2325
}

‎dotnet-client-libraries/BogusNugetPackage/Tests/Tests.cs‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using BogusNugetPackage;
1+
using Bogus;
2+
using BogusNugetPackage;
23
using System;
34
using System.Collections.Generic;
45
using System.Linq;
@@ -29,12 +30,22 @@ public void WhenGettingSingleVehicle_ThenObjectIsNotNull()
2930
}
3031

3132
[Fact]
32-
public void WhenGettingSingleEmployee_ThenEmailContainsLastName()
33+
public void WhenGettingSingleEmployee_ThenEmailStartsWithFirstName()
3334
{
3435
DataGenerator.InitBogusData();
3536

3637
var employee = DataGenerator.Employees.First();
3738

38-
Assert.Contains(employee.LastName, employee.Email);
39+
// Bogus slugifies the name for the email, so D'angelo becomes Dangelo
40+
Assert.StartsWith(Utils.Slugify(employee.FirstName), employee.Email);
41+
}
42+
43+
[Fact]
44+
public void WhenGeneratingWithTheSameSeed_ThenVehiclesAreEqual()
45+
{
46+
var first = DataGenerator.GenerateRepeatableVehicles(1338);
47+
var second = DataGenerator.GenerateRepeatableVehicles(1338);
48+
49+
Assert.Equal(first.Select(v => v.ToString()), second.Select(v => v.ToString()));
3950
}
4051
}

‎dotnet-client-libraries/BogusNugetPackage/Tests/Tests.csproj‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net7.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

88
<IsPackable>false</IsPackable>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
13-
<PackageReference Include="xunit" Version="2.4.2" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
12+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.11.0" />
13+
<PackageReference Include="xunit" Version="2.9.3" />
14+
<PackageReference Include="xunit.runner.visualstudio" Version="4.0.1">
1515
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1616
<PrivateAssets>all</PrivateAssets>
1717
</PackageReference>
18-
<PackageReference Include="coverlet.collector" Version="3.1.2">
18+
<PackageReference Include="coverlet.collector" Version="10.1.0">
1919
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2020
<PrivateAssets>all</PrivateAssets>
2121
</PackageReference>

0 commit comments

Comments
 (0)