¿Cómo uso Autofixture (v3) con ICustomization, ISpecimenBuilder para tratar con el parámetro constructor?

Estoy tratando de superar un escenario en el que una clase tiene un parámetro de constructor de cadenas que no se puede satisfacer con ninguna cadena antigua generada por Autofixture (el valor que busca Guid-y).

Antes de tener la tentación de responder simplemente con un enlace aEntrada de blog de Mark Seemann Ploeh sobre personalizaciones basadas en convenciones, déjame decirte que he estado haciendo referencia a él y otras entradas de su blog para esta prueba, que no puedo pasar.

Cuando paso a través de la depuración, puedo ver que en algún punto el parámetro del constructor se pasa con el valor válido, pero la prueba todavía falla con el valor de Guid-y Color. Creo que esto tiene algo que ver con el hecho de que hay tanto un valor de parámetro de "color",y una propiedad 'Color' para ser rellenada por Autofixture. ¿Es que he escrito un ISpecimenBuilder que aborda el parámetro constructor, pero estoy probando el valor de la propiedad pública (dos cosas diferentes)?

Sé que todo esto es excesivo para el ejemplo, pero imagino un escenario más complicado en el que usar elBuild<T>().With() El método no sería SECO.

La prueba de fracaso

    [Fact]
    public void Leaf_Color_Is_Brown()
    {
        // arrange
        var fixture = new Fixture().Customize(new LeafColorCustomization());

        // act
        var leaf = fixture.Create<Leaf>();

        // using .Build<>.With(), test passes
        //var leaf = fixture.Build<Leaf>().With(l => l.Color, "brown").CreateAnonymous();

        // assert
        Assert.True(leaf.Color == "brown");
    }

El SUT

    public class Leaf
    {
        public Leaf(string color)
        {
            if (color != "brown")
                throw new ArgumentException(@"NO LEAF FOR YOU!");

            this.Color = color;
        }
        public string Color { get; set; }
    }

La implementación de CompositeCustomization (Sé que el AutoMoqCustomization () no es necesario en este ejemplo)

    public class LeafCustomization : CompositeCustomization
    {
        public LeafCustomization()
            : base(
            new LeafColorCustomization(),
            new AutoMoqCustomization()) { }
    }

La personalización específica de la hoja

    public class LeafColorCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            if (fixture == null)
                throw new ArgumentNullException("fixture");

            fixture.Customizations.Add(new LeafBuilder());
        }
    }

El constructor de cadenas con nombre de color específico de ISpecimenBuilder

    public class LeafBuilder : ISpecimenBuilder
    {
        public object Create(object request, ISpecimenContext context)
        {
            var pi = request as ParameterInfo;
            if (pi == null)
                return new NoSpecimen(request);

            if (pi.ParameterType != typeof(string) || pi.Name != "color")
                return new NoSpecimen(request);

            return "brown";
        }
    }

Respuestas a la pregunta(3)

Su respuesta a la pregunta