2013-03-18 86 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無法 創建來自 System.Runtime的實例。 Serialization.ExtensionDataObject,很可能是因爲 它沒有公共的構造,是一個抽象的,非公開式..

問:是否有註冊AutoFixture內該對象的一種方式,所以它實例化它null或其他任何東西,這會讓我對所有具有ExtensionData屬性的對象執行CreateAnonymous

回答

12

我希望有人會發現它有用,我已經成功地得到它與PropertyTypeOmitter類爲每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

自AutoFixture 3.x以來,最後一行代碼觸發了由於contstructor調用被標記爲Obsolete而導致的警告。要刪除它,請將其更改爲:new NoSpecimen() – dzendras 2016-08-10 12:39:21

19

最容易做到這一點的方法是:

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

向AutoFixture註冊一個特定的方法來初始化所有的ExtensionDataObject,並給出Func。在這種情況下,Func總是返回null,所以你很好走。

+0

這很好。 Chuck的答案和這個一樣,最終呢? – VitalyB 2014-02-19 16:40:45

+3

這對我有效。這個發現偉大的工作! – 2014-03-05 19:47:38