Ploeh AutoFixture无法从System.Runtime.Serialization.ExtensionDataObject创建实例

我们有一个MVC项目,引用了WCF服务。 这些引用将(ExtensionDataObject)ExtensionData属性添加到每个DTO和Response对象,现在AutoFixture无法创建这些类型的匿名实例。

例:

 public partial class SearchResultsDto : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { [System.NonSerializedAttribute()] private System.Runtime.Serialization.ExtensionDataObject extensionDataField; [global::System.ComponentModel.BrowsableAttribute(false)] public System.Runtime.Serialization.ExtensionDataObject ExtensionData { get { return this.extensionDataField; } set { this.extensionDataField = value; } } } 

码:

 _fixture = new Fixture().Customize(new AutoMoqCustomization()); var dto = _fixture.CreateAnonymous(); 

例外:

Ploeh.AutoFixture.ObjectCreationException:Ploeh.AutoFixture.ObjectCreationException:AutoFixture无法从System.Runtime.Serialization.ExtensionDataObject创建实例,很可能是因为它没有公共构造函数,是抽象或非公共类型。

问题:有没有办法在AutoFixture中注册此对象,以便将其实例化为null或其他任何东西,这将允许我在具有ExtensionData属性的所有对象上执行CreateAnonymous

最简单的方法是:

 fixture.Register(() => null); 

这将注册到AutoFixture一个特定的方法来初始化所有ExtensionDataObject,并给出Func。 在这种情况下,Func总是返回null,所以你很高兴。

我希望有人会觉得它很有用,我已经设法让它按照这个线程使用PropertyTypeOmitter类:

 public void Test() { var fixture = new Fixture(); fixture.Customizations.Add( new PropertyTypeOmitter( typeof(ExtensionDataObject))); var person = fixture.CreateAnonymous(); } internal class PropertyTypeOmitter : ISpecimenBuilder { private readonly Type type; internal PropertyTypeOmitter(Type type) { if (type == null) throw new ArgumentNullException("type"); this.type = type; } internal Type Type { get { return this.type; } } public object Create(object request, ISpecimenContext context) { var propInfo = request as PropertyInfo; if (propInfo != null && propInfo.PropertyType == type) return new OmitSpecimen(); return new NoSpecimen(); } } 

为了使它对DRYer和CTRL + C友好,这里是Spiros Dellaportases(谢谢!)答案包装在夹具中定制:

 public class OmitExtensionDataObjectPropertyCustomization : ICustomization { public void Customize(IFixture fixture) { fixture.Register(() => null); } }