Как использовать Autofixture (v3) с ICustomization, ISpecimenBuilder для работы с параметром конструктора?

Я пытаюсь преодолеть сценарий, в котором класс имеет параметр конструктора строки, который не может быть удовлетворен какой-либо старой строкой, сгенерированной Autofixture (значение Guid-y looking).

Прежде чем вы захотите ответить просто со ссылкой наЗапись в блоге Марка Симанна Ploeh о кастомизированных настройкахПозвольте мне сказать, что я ссылался на него и другие записи в его блоге для этого теста, который я не могу пройти.

Когда я перехожу к отладке, я вижу, что в какой-то момент параметр конструктора передается с допустимым значением, но тест все равно не проходит со значением Guid-y Color. Я думаю, что это как-то связано с тем, что есть значение параметра «цвет»,а также свойство 'Color', которое будет заполнено автофиксом. Это то, что я написал ISpecimenBuilder, который обращается к параметру конструктора, но я проверяю значение открытого свойства (две разные вещи)?

Я знаю, что все это излишне для примера, но я представляю более сложный сценарий, в котором использованиеBuild<T>().With() Метод не будет СУХОЙ.

Испытание на провал

    [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");
    }

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; }
    }

Реализация CompositeCustomization (Я знаю, что AutoMoqCustomization () не требуется в этом примере)

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

Специфичная для листа ICustomization

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

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

Специфичный для типа String-конструктор с именем-цветом-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";
        }
    }

Ответы на вопрос(3)

Ваш ответ на вопрос