2013-03-18 16 views
17

WCFサービスへの参照を持つMVCプロジェクトがあります。これらの参照では、すべてのDTOおよびResponseオブジェクトに(ExtensionDataObject)ExtensionDataというプロパティが追加されました。現在はAutoFixtureは、これらのタイプの匿名インスタンスの作成に失敗しています。Ploeh AutoFixtureはSystem.Runtime.Serialization.ExtensionDataObjectからインスタンスを作成できませんでした

例:

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<SearchResultsDto>(); 

例外:

Ploeh.AutoFixture.ObjectCreationException: Ploeh.AutoFixture.ObjectCreationException:AutoFixtureはANを作成 することができませんでした例: System.Runtime。 Serialization.ExtensionDataObject、最も可能性が高いそれは、何のpublicコンストラクタを持たない抽象的または非パブリック型の..です

質問 ので:それはとしてそれをインスタンス化するようAutoFixture以内にこのオブジェクトを登録する方法は、ありますnullなど、ExtensionDataプロパティを持つすべてのオブジェクトに対してCreateAnonymousを実行させることができます。

私は誰かがそれが役に立つ、私はそれが this threadごとに PropertyTypeOmitterクラスで仕事を得ることができた見つけることを願っています

答えて

12

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

AutoFixture 3.x以降では、コードの最後の行が、contstructor呼び出しがObsoleteとマークされたことに起因する警告をトリガします。これを削除するには、次のように変更します。new NoSpecimen() – dzendras

19

それを行うための最も簡単な方法は次のとおりです。

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

Funcを指定して、すべてのExtensionDataObjectを初期化する特定の方法をAutoFixtureに登録します。この場合、Funcは常にnullを返します。

+0

これは素晴らしい動作です。チャックの答えとこれは結局同じですか? – VitalyB

+3

これは私のために働いた。この発見で偉大な仕事! –

関連する問題