2013-03-18 145 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