2012-01-14 145 views
3

我是单元测试领域的新手,所以我有一些问题:如何测试返回DataTable的方法?

是否让一个返回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 2012-01-14 17:39:58

+0

也许问一个问题'我怎样才能单元测试这个方法返回一个DataTable',提供一些代码并从那里取出。 – blank 2012-01-14 17:53:35

回答

0

可以测试在这里是什么,是返回DataTable结构是否确实是你所期望的。这些都是简单而简单的单元测试。确定什么预计GeneratePeriods方法(如,你想要它做什么?),并编写测试,检查它实际上是什么方法。例如:

  • 测试是否发生时期的正确数量
  • 测试特定时期是否已正确设置行/列行数据
  • 测试是否正确格式
  • ...,可能很多更多

在附注中,从函数返回DataTable没有任何问题。