我们有一个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。
答案 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);
}
}