Подтвердить что ты не робот

Ploeh AutoFixture не удалось создать экземпляр из System.Runtime.Serialization.ExtensionDataObject

У нас есть проект 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.

4b9b3361

Ответ 1

Самый простой способ сделать это:

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

Это регистрирует AutoFixture особым способом инициализации всего ExtensionDataObject, с предоставленным Func. В этом случае Func всегда возвращает значение null, поэтому вам хорошо идти.

Ответ 2

Я надеюсь, что кто-то найдет это полезным, мне удалось заставить его работать с классом 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();
    }
}

Ответ 3

Чтобы сделать бит DRYer и CTRL + C дружелюбным, вот ответ Spiros Dellaportases (спасибо!), Завернутый в приспособление. Настройка:

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