Как создать настройку, которая пропускает автоматические свойства для целого ряда типов?

Я пытаюсь создать настройку, которая позволяет мне указать, что свойства типов, которые не находятся в определенном пространстве имен, не должны заполняться.

В основном я пытаюсь изменить это:

fixture.Customize<Window>(c => c.OmitAutoProperties());
fixture.Customize<ContentControl>(c => c.OmitAutoProperties());
fixture.Customize<TextBlock>(c => c.OmitAutoProperties());
// Many many more...

к этому:

fixture.Customize(t => !t.Namespace.StartsWith("MyProject"),
                  c => c.OmitAutoProperties());

Как этого добиться?

На самом деле я забочусь только о результате, а не о вымышленном API, показанном здесь, поэтому реализую свой собственный ISpecimenBuilder или же ICustomization не проблема.

1 ответ

Решение

Самый простой способ сделать это, вероятно, через пользовательский конструктор образцов:

public class OmitPropertyForTypeInNamespace : ISpecimenBuilder
{
    private readonly string ns;

    public OmitPropertyForTypeInNamespace(string ns)
    {
        this.ns = ns;
    }

    public object Create(object request, ISpecimenContext context)
    {
        if (IsProperty(request) &&
            IsDeclaringTypeInNamespace((PropertyInfo)request))
        {
            return new OmitSpecimen();
        }

        return new NoSpecimen(request);
    }

    private bool IsProperty(object request)
    {
        return request is PropertyInfo;
    }

    private bool IsDeclaringTypeInNamespace(PropertyInfo property)
    {
        var declaringType = property.DeclaringType;
        return declaringType.Namespace.Equals(
            this.ns,
            StringComparison.OrdinalIgnoreCase);
    }
}

Как обычно, это хорошее соглашение, чтобы также обеспечить соответствующую настройку:

public class OmitAutoPropertiesForTypesInNamespace : ICustomization
{
    private readonly string ns;

    public OmitAutoPropertiesForTypesInNamespace(string ns)
    {
        this.ns = ns;
    }

    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(new OmitPropertyForTypeInNamespace(this.ns));
    } 
}

Это в конечном итоге позволит вам сказать:

var fixture = new Fixture();
fixture.Customize(new OmitAutoPropertiesForTypesInNamespace("MyProject"));
Другие вопросы по тегам