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実行できるようにインスタンス化する方法はありますか?CreateAnonymousExtensionData

4

3 に答える 3

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 に答える