From b9049abf8b40203c09079741bcb328da95899f81 Mon Sep 17 00:00:00 2001 From: bchavez Date: Fri, 5 Mar 2021 21:15:23 -0800 Subject: [PATCH] Add answer to StackOverflow question: https://stackoverflow.com/questions/66444118/how-to-use-bogus-faker-with-initialization-properties Re: #213 --- .../Question66444118.cs | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Source/Bogus.Tests/StackOverflowQuestions/Question66444118.cs diff --git a/Source/Bogus.Tests/StackOverflowQuestions/Question66444118.cs b/Source/Bogus.Tests/StackOverflowQuestions/Question66444118.cs new file mode 100644 index 00000000..9b4846f3 --- /dev/null +++ b/Source/Bogus.Tests/StackOverflowQuestions/Question66444118.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using FluentAssertions; +using Xunit; + +namespace Bogus.Tests.StackOverflowQuestions +{ + //https://stackoverflow.com/questions/66444118/how-to-use-bogus-faker-with-initialization-properties + public class Question66444118 : SeededTest + { + [Fact] + public void can_reflect_private_backing_fields_in_fakerT() + { + var backingFieldBinder = new BackingFieldBinder(); + var fooFaker = new Faker(binder: backingFieldBinder) + .SkipConstructor() + .RuleFor(f => f.Name, f => f.Name.FullName()); + + var foo = fooFaker.Generate(); + foo.Name.Should().NotBeNullOrWhiteSpace(); + } + + public class BackingFieldBinder : IBinder + { + public Dictionary GetMembers(Type t) + { + var availableFieldsForFakerT = new Dictionary(); + var bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance; + var allMembers = t.GetMembers(bindingFlags); + var allBackingFields = allMembers + .OfType() + .Where(fi => fi.IsPrivate && fi.IsInitOnly) + .Where(fi => fi.Name.EndsWith("__BackingField")) + .ToList(); + + foreach (var backingField in allBackingFields) + { + var fieldName = backingField.Name.Substring(1).Replace(">k__BackingField", ""); + availableFieldsForFakerT.Add(fieldName, backingField); + } + return availableFieldsForFakerT; + } + } + + public class Foo + { + public Foo(string name) + { + this.Name = name; + } + public string Name { get; } + } + } + + public static class MyExtensionsForFakerT + { + public static Faker SkipConstructor(this Faker fakerOfT) where T : class + { + return fakerOfT.CustomInstantiator(_ => FormatterServices.GetUninitializedObject(typeof(T)) as T); + } + } +} \ No newline at end of file