5

テストとシード データの作成には、優れた .NET ライブラリAutoPocoを使用しています。

私のモデルには、StartDate と EndDate の 2 つの日付プロパティがあります。

EndDate を開始日の 3 時間後にしたい。

以下のautopoco用のカスタムデータソースを作成しました。これは、最小日付と最大日付の間のランダムなDatetimeを返します

class DefaultRandomDateSource : DatasourceBase<DateTime>
{
    private DateTime _MaxDate { get; set; }
    private DateTime _MinDate { get; set; }
    private Random _random { get; set; }


    public DefaultRandomDateSource(DateTime MaxDate, DateTime MinDate)
    {
        _MaxDate = MaxDate;
        _MinDate = MinDate;

    }

    public override DateTime Next(IGenerationSession session)
    {
        var tspan = _MaxDate - _MinDate;
        var rndSpan = new TimeSpan(0, _random.Next(0, (int) tspan.TotalMinutes), 0);


        return _MinDate + rndSpan;
    }

}

しかし、AutoPoco の構成では、自動生成された開始日から 3 時間後に EndDate を取得するにはどうすればよいですか?

これがautopoco構成です

 IGenerationSessionFactory factory = AutoPocoContainer.Configure(x =>
            {
                x.Conventions(c => { c.UseDefaultConventions(); });
                x.AddFromAssemblyContainingType<Meeting>();
                x.Include<Meeting>()
                    .Setup((c => c.CreatedBy)).Use<FirstNameSource>()
                    .Setup(c => c.StartDate).Use<DefaultRandomDateSource>(DateTime.Parse("21/05/2011"), DateTime.Parse("21/05/2012"));
            });
4

1 に答える 1

1

必要な問題を正しく理解している場合: to set EndDatefromStartDate . 新しいアイテムを作成し、DataSource構築中の現在のアイテムを取得して、そこから値を読み取る必要がありました。十分に確認していませんが、後で設定すると失敗する可能性がありStartDateますEndDate(プロパティは設定された順序で設定されていると思いますが、AutoPocoのソースコードを読んでください)。また、今日 (2012 年 2 月 20 日) の時点でCodePlexの最新バージョンを使用しています。

public class MeetingsGenerator
{
    public static IList<Meeting> CreateMeeting(int count)
    {
        var factory = AutoPocoContainer.Configure(x =>
        {
            x.Conventions(c => { c.UseDefaultConventions(); });
            x.Include<Meeting>()
                .Setup((c => c.CreatedBy)).Use<FirstNameSource>()
                .Setup(c => c.StartDate).Use<DefaultRandomDateSource>
                                  (DateTime.Parse("21/May/2012"), 
                                    DateTime.Parse("21/May/2011"))
                .Setup(c => c.EndDate).Use<MeetingEndDateSource>(0, 8);
        });
        return factory.CreateSession().List<Meeting>(count).Get();
    }
}

public class Meeting
{
    public string CreatedBy { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

public class MeetingEndDateSource : DatasourceBase<DateTime>
{
    private int mMin;
    private int mMax;
    private Random mRandom = new Random(1337);

    public MeetingEndDateSource(int min, int max)
    {
        mMin = min;
        mMax = max;
    }

    public override DateTime Next(IGenerationContext context)
    {
        var node = (TypeGenerationContextNode)((context.Node).Parent);
        var item = node.Target) as Meeting;

        if (item == null)
            return DateTime.Now;

        return item.StartDate.AddHours(mRandom.Next(mMin, mMax + 1));
    }
}

class DefaultRandomDateSource : DatasourceBase<DateTime>
{
    private DateTime _MaxDate { get; set; }
    private DateTime _MinDate { get; set; }
    private Random _random = new Random(1337);

    public DefaultRandomDateSource(DateTime MaxDate, DateTime MinDate)
    {
        _MaxDate = MaxDate;
        _MinDate = MinDate;
    }

    public override DateTime Next(IGenerationContext context)
    {
        var tspan = _MaxDate - _MinDate;

        var rndSpan = new TimeSpan(0 
                                  , _random.Next(0, (int)tspan.TotalMinutes)
                                  , 0);

        return _MinDate + rndSpan;
    }
}
于 2012-02-20T07:37:48.213 に答える