如何测试返回 DataTable 的方法?

3

我是单元测试领域的初学者,所以我有一些问题:

返回 DataTable 的方法是一个好的做法吗?如果是,那么我该如何测试它?

这是他们要求我测试的一个函数:

public static DataTable GeneratePeriods(DateTime startDate, DateTime endDate, string periodicity)
{
    try
    {
        using (DataTable periods = new DataTable())
        {
            periods.Columns.Add(new DataColumn("Dates", typeof(DateTime)));
            int startYear = startDate.Year;
            int endYear = endDate.Year;
            int Diff = endYear - startYear + 1;
            int LoopYear;
            /* This generates all regular periods from the begin date to the end date */
            switch (periodicity)
            {
                //monthly
                case "Mensuelle":
                    for (int j = 0; j < Diff; j++)
                    {
                        LoopYear = startYear + j;
                        for (int i = 1; i <= 12; i++)
                            if (i != 12)
                                periods.Rows.Add(new DateTime(LoopYear, i + 1, 1).AddDays(-1));
                            else
                                periods.Rows.Add(new DateTime(LoopYear, 12, 31));
                    }
                    break;
                //quarterly
                case "Trimestrielle":
                    for (int j = 0; j < Diff; j++)
                    {
                        LoopYear = startYear + j;
                        for (int i = 1; i <= 4; i++)
                            if (i != 4)
                                periods.Rows.Add(new DateTime(LoopYear, (i * 3) + 1, 1).AddDays(-1));
                            else
                                periods.Rows.Add(new DateTime(LoopYear, 12, 31));
                    }
                    break;
                //biannual
                case "Semestrielle":
                    for (int j = 0; j < Diff; j++)
                    {
                        LoopYear = startYear + j;
                        for (int i = 1; i <= 2; i++)
                            if (i != 2)
                                periods.Rows.Add(new DateTime(LoopYear, (i * 6) + 1, 1).AddDays(-1));
                            else
                                periods.Rows.Add(new DateTime(LoopYear, 12, 31));
                    }
                    break;
                //annual
                case "Annuelle":
                    for (int j = 0; j < Diff; j++)
                    {
                        LoopYear = startYear + j;
                        for (int i = 1; i <= 1; i++)
                            periods.Rows.Add(new DateTime(LoopYear, 12, 31));
                    }
                    break;
            }
            //this adds startDate in periods datatable if it doesn't exist
            if (periods.Select(String.Format("Dates = '{0}'", startDate)).Length == 0)
                periods.Rows.Add(startDate);
            //this adds endDate date in periods datatable if it doesn't exist
            if (periods.Select(String.Format("Dates = '{0}'", endDate.AddDays(-1))).Length == 0)
                periods.Rows.Add(endDate);
            //this removes all date ranges below the startDate
            DataRow[] dr = periods.Select(String.Format("Dates < '{0}'", startDate));
            foreach (DataRow row in dr)
                periods.Rows.Remove(row);
            //this removes all date ranges above the endDate
            DataRow[] dr1 = periods.Select(String.Format("Dates >'{0}'", endDate.AddDays(-1)));
            foreach (DataRow row in dr1)
                periods.Rows.Remove(row);
            //this adds endDate date in periods datatable if it doesn't exist for the second time ! (I personnaly don't know why it's duplicated but it dosen't work without this =) )
            if (periods.Select(String.Format("Dates = '{0}'", endDate.AddDays(-1))).Length == 0)
                periods.Rows.Add(endDate);
            DataView dv = new DataView(periods) { Sort = "Dates ASC" };
            // this initialize a new datatable with sorted dates
            DataTable dt_dates = dv.ToTable();
            // this initialize a new datatable 
            DataTable dt_periods = new DataTable();
            dt_periods.Columns.Add("Periods", typeof(string));
            dt_periods.Columns.Add("NombreJours", typeof(int));
            // this loop creates period ranges shown to the user (Du startDate au endDate)
            DateTime dateDebutPeriode;
            DateTime dateFinPeriode;
            int NombreJours;
            for (int i = 0; i < dv.Table.Rows.Count - 1; i++)
                if (i == 0)
                {
                    dateDebutPeriode = DateTime.Parse(dt_dates.Rows[i]["Dates"].ToString());
                    dateFinPeriode = DateTime.Parse(dt_dates.Rows[i + 1]["Dates"].ToString());
                    NombreJours = dateFinPeriode.Subtract(dateDebutPeriode).Days + 1;
                    dt_periods.Rows.Add(String.Format("Du {0} au {1}", dateDebutPeriode.ToShortDateString(), dateFinPeriode.ToShortDateString()), NombreJours);
                }
                else
                    if (i == dv.Table.Rows.Count - 2)
                    {
                        dateDebutPeriode = DateTime.Parse(dt_dates.Rows[i]["Dates"].ToString()).AddDays(1);
                        dateFinPeriode = DateTime.Parse(dt_dates.Rows[i + 1]["Dates"].ToString()).AddDays(-1);
                        NombreJours = dateFinPeriode.Subtract(dateDebutPeriode).Days + 1;
                        dt_periods.Rows.Add(String.Format("Du {0} au {1}", dateDebutPeriode.ToShortDateString(), dateFinPeriode.ToShortDateString()), NombreJours);
                    }
                    else
                    {
                        dateDebutPeriode = DateTime.Parse(dt_dates.Rows[i]["Dates"].ToString()).AddDays(1);
                        dateFinPeriode = DateTime.Parse(dt_dates.Rows[i + 1]["Dates"].ToString());
                        NombreJours = dateFinPeriode.Subtract(dateDebutPeriode).Days + 1;
                        dt_periods.Rows.Add(String.Format("Du {0} au {1}", dateDebutPeriode.ToShortDateString(), dateFinPeriode.ToShortDateString()), NombreJours);
                    }
            return dt_periods;
        }
    }
    catch (InvalidOperationException)
    {
        throw;
    }
}

1
请不要在一个问题中问多个问题。请分别提出它们。然而,在这种情况下,您的第二个问题并不是一个建设性的问题,很可能会被关闭。 - ChrisF
也许可以问一个问题:“如何对返回DataTable的方法进行单元测试”,提供一些代码,然后开始操作。 - blank
1个回答

0

在这里你可以测试的是,返回的DataTable结构是否确实符合你的期望。这些都是简单明了的单元测试。确定从GeneratePeriods方法中期望得到什么(也就是说,你想让它做什么?),然后编写测试来检查它是否确实执行了该方法。例如:

  • 测试生成的周期数是否正确
  • 测试给定周期是否设置了正确的行/列
  • 测试行数据是否以正确的格式呈现
  • ...还有很多其他测试

顺便说一句,从函数中返回DataTable并没有什么问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接