Как создать настройку, которая пропускает автоматические свойства для целого ряда типов?
Я пытаюсь создать настройку, которая позволяет мне указать, что свойства типов, которые не находятся в определенном пространстве имен, не должны заполняться.
В основном я пытаюсь изменить это:
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"));