Ploeh AutoFixture无法从System.Runtime.Serialization.ExtensionDataObject创建实例

Гро*_*ный 23 .net c# autofixture

我们有一个MVC项目,引用了WCF服务.这些引用(ExtensionDataObject)ExtensionData为每个DTO和Response对象添加了属性,现在AutoFixture无法创建这些类型的匿名实例.

例:

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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

码:

_fixture = new Fixture().Customize(new AutoMoqCustomization());
var dto = _fixture.CreateAnonymous<SearchResultsDto>();
Run Code Online (Sandbox Code Playgroud)

例外:

Ploeh.AutoFixture.ObjectCreationException:Ploeh.AutoFixture.ObjectCreationException:AutoFixture无法从System.Runtime.Serialization.ExtensionDataObject创建实例,很可能是因为它没有公共构造函数,是抽象或非公共类型.

问题:有没有办法在AutoFixture中注册这个对象,以便它将其实例化为null其他任何东西,这将让我CreateAnonymous对所有具有ExtensionData属性的对象进行实例化.

小智 32

最简单的方法是:

fixture.Register<ExtensionDataObject>(() => null);
Run Code Online (Sandbox Code Playgroud)

这将注册到AutoFixture一个特定的方法来初始化所有ExtensionDataObject,并给出Func.在这种情况下,Func总是返回null,所以你很高兴.

  • 这对我有用.这个发现很棒! (3认同)

Гро*_*ный 13

我希望有人会发现它很有用,我已经设法让它PropertyTypeOmitter按照这个线程与类一起工作:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)