28

我们有一个引用 WCF 服务的 MVC 项目。这些引用(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属性的对象进行操作。

4

3 回答 3

39

最简单的方法是:

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

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

于 2013-07-31T11:33:12.227 回答
15

我希望有人会发现它很有用,我已经设法让它按照这个线程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();
    }
}
于 2013-03-18T14:32:57.797 回答
1

为了让它更干燥和CTRL友好C,这里是 Spiros Dellaportases(谢谢!)答案包含在夹具定制中:

public class OmitExtensionDataObjectPropertyCustomization : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Register<ExtensionDataObject>(() => null);
    }
}
于 2018-04-25T10:41:04.470 回答