Гро*_*ный 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,所以你很高兴.
Гро*_*ный 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)