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

时间:2013-03-18 14:11:36

标签: c# .net 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;
            }
        }
    }

代码:

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

例外:

  

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

问题:有没有办法在AutoFixture中注册此对象,以便将其实例化为null或其他任何内容,这样我就可以CreateAnonymous对所有ExtensionData对象进行操作} property。

3 个答案:

答案 0 :(得分:31)

最简单的方法是:

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

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

答案 1 :(得分:13)

我希望有人会发现它很有用,我已按照this thread设法让它与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();
    }
}

答案 2 :(得分:2)

要使它成为DRYer和 CTRL + C 友好,这里是Spiros Dellaportases(谢谢!)回答包装在夹具中定制:

public class OmitExtensionDataObjectPropertyCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Register<ExtensionDataObject>(() => null);
    }
}