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
.
Ответы
Ответ 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);
}
}