Dan*_*rth 8 .net c# autofixture
我正在尝试创建一个自定义,允许我指定不应填充不在某个名称空间中的类型的属性.
基本上,我试图改变这个:
fixture.Customize<Window>(c => c.OmitAutoProperties());
fixture.Customize<ContentControl>(c => c.OmitAutoProperties());
fixture.Customize<TextBlock>(c => c.OmitAutoProperties());
// Many many more...
Run Code Online (Sandbox Code Playgroud)
对此:
fixture.Customize(t => !t.Namespace.StartsWith("MyProject"),
c => c.OmitAutoProperties());
Run Code Online (Sandbox Code Playgroud)
怎么做到这一点?
我实际上只关心结果,而不是这里显示的虚构API,所以实现我自己ISpecimenBuilder或ICustomization不是问题.
最简单的方法可能是通过自定义样本生成器:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
像往常一样,提供匹配的自定义也是一个很好的约定:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
这最终会让你说:
var fixture = new Fixture();
fixture.Customize(new OmitAutoPropertiesForTypesInNamespace("MyProject"));
Run Code Online (Sandbox Code Playgroud)