2013-03-18 16 views
17

Mamy projekt MVC z odniesieniami do usług WCF. Te odwołania dodały właściwość do każdego obiektu DTO i odpowiedzi, a teraz AutoFixture nie tworzą anonimowych instancji tych typów.Ploeh AutoFixture nie może utworzyć instancji z System.Runtime.Serialization.ExtensionDataObject

przykład:

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

Kod:

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

Wyjątek

Ploeh.AutoFixture.ObjectCreationException: Ploeh.AutoFixture.ObjectCreationException: AutoFixture był w stanie utworzyć instancja z System.Runtime. Serialization.ExtensionDataObject, najprawdopodobniej z powodu nie ma konstruktora publicznego, jest abstrakcyjną lub niepubliczne typ ..

Pytanie: Czy istnieje sposób rejestrowania tego obiektu wewnątrz AutoFixture, tak że wystąpienie go jako null lub cokolwiek innego, co pozwoliłoby mi wykonać CreateAnonymous we wszystkich obiektach z właściwością ExtensionData.

Odpowiedz

12

Mam nadzieję, że ktoś znajdzie to użyteczne, udało mi się zmusić go do pracy z klasą PropertyTypeOmitter jak na this thread:

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

Od czasu AutoFixture 3.x ostatnia linia kodu wyzwala ostrzeżenie spowodowane przez to, że wywołanie procesora zostało oznaczone jako Przestarzałe. Aby go usunąć, zmień go na: nowy NoSpecimen() – dzendras

19

Najprostszym sposobem na to jest:

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

To rejestruje w AutoFixture określony sposób zainicjowania wszystkich ExtensionDataObject, z podanym Func. W takim przypadku funkcja Func zawsze zwraca wartość null, więc dobrze jest przejść.

+0

Działa to świetnie. Czy odpowiedź Chucka i ta czynią to samo? – VitalyB

+3

To zadziałało dla mnie. Świetna robota z tym znaleziskiem! –

Powiązane problemy