c# .net autofixture

c# - Ploeh AutoFixture no pudo crear una instancia de System.Runtime.Serialization.ExtensionDataObject



.net (3)

Tenemos un proyecto MVC con referencias a servicios WCF. Esas referencias agregaron (ExtensionDataObject)ExtensionData propiedad (ExtensionDataObject)ExtensionData a cada objeto DTO y Response y ahora AutoFixture no puede crear instancias anónimas de estos tipos.

Ejemplo:

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

Código:

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

Excepción:

Ploeh.AutoFixture.ObjectCreationException: Ploeh.AutoFixture.ObjectCreationException: AutoFixture no pudo crear una instancia de System.Runtime.Serialization.ExtensionDataObject, probablemente porque no tiene constructor público, es un tipo abstracto o no público.

Pregunta: ¿Hay alguna forma de registrar este objeto dentro de la Autofijación, de modo que lo cree como null o cualquier otra cosa, lo que me permitiría CreateAnonymous en todos los objetos con la propiedad ExtensionData ?


Espero que a alguien le resulte útil, he logrado que funcione con la clase PropertyTypeOmitter según este hilo :

public void Test() { var fixture = new Fixture(); fixture.Customizations.Add( new PropertyTypeOmitter( typeof(ExtensionDataObject))); var person = fixture.CreateAnonymous<Person>(); } 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(); } }


La forma más fácil de hacerlo es:

fixture.Register<ExtensionDataObject>(() => null);

Eso registra en AutoFixture una forma específica de inicializar todos los ExtensionDataObject, con la función dada. En este caso, el Func siempre devuelve un valor nulo, por lo que puede continuar.


Para hacerlo más fácil con DRYer y CTRL + C , aquí está Spiros Dellaportases (¡gracias!) Respuesta envuelta en la personalización del dispositivo:

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