2013-03-18 11 views
17

Wir haben ein MVC-Projekt mit Verweisen auf WCF-Dienste. Diese Referenzen hinzugefügt (ExtensionDataObject)ExtensionData Eigenschaft zu jedem DTO und Response-Objekt und jetzt AutoFixture erstellt keine anonyme Instanzen dieser Typen.Ploeh AutoFixture konnte keine Instanz von System.Runtime.Serialization.ExtensionDataObject erstellen

Beispiel:

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

Code:

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

Ausnahme:

Ploeh.AutoFixture.ObjectCreationException: Ploeh.AutoFixture.ObjectCreationException: AutoFixture nicht in der Lage war zu ein erstellen Instanz von System.Runtime. Serialization.ExtensionDataObject, höchstwahrscheinlich, weil es keinen öffentlichen Konstruktor hat, ist ein abstrakter oder nicht-öffentlicher Typ ..

Frage: Gibt es eine Möglichkeit, diese Aufgabe Registrierung innerhalb des AutoFixture, so dass sie es instanziiert als null oder irgendetwas anderes, was würde ich CreateAnonymous auf alle Objekte mit ExtensionData Eigenschaft tun lassen.

Antwort

12

Ich hoffe, jemand wird es nützlich sein, ich habe es geschafft, um es mit der PropertyTypeOmitter Klasse nach dem this thread an die Arbeit:

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(); 
    } 
} 
+0

Seit AutoFixture 3.x löst die letzte Codezeile eine Warnung aus, die dadurch verursacht wird, dass der Konstruktoraufruf als veraltet markiert ist. Um es zu entfernen, ändern Sie es in: new NoSpecimen() – dzendras

19

Der einfachste Weg, es zu tun ist:

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

Das registriert zu AutoFixture eine bestimmte Methode zum Initialisieren aller ExtensionDataObject mit dem Func gegeben. In diesem Fall gibt der Func immer null zurück, also ist es gut zu gehen.

+0

Das funktioniert großartig. Ist Chucks Antwort und diese die gleiche? – VitalyB

+3

Das hat für mich funktioniert. Gute Arbeit mit diesem Fund! –

Verwandte Themen