与DataTable行值进行比较

时间:2017-06-26 14:03:53

标签: c# unit-testing datatable

我需要为我创建的新方法创建单元测试。现在,我在将实际结果与我想要的结果进行比较时遇到了问题。

有问题的方法是:

public DataTable UniformDateFormat(DataTable durations, string targetColumn)
{

    foreach (DataRow row in durations.Rows)
     {
         if (row[targetColumn].ToString().Length > 0)
          {
              DateTime conv = DateTime.Parse(row[targetColumn].ToString());
          }
     }

     return durations;
}

此方法只是检查特定列,然后转换在列的每个单元格中找到的日期值(它是excel表)并将它们转换为更均匀的列。

我的测试代码是:

DataTable table = new DataTable();
table.Columns.Add("Reporting Date");

table.Rows.Add("12-06-2007");
test = new DurationData(excelConfig);

foreach (DataRow row in table.Rows)
{
    result = row["Reporting Date"].ToString();

}
// the test I want to run
if (table.Columns.Contains("Reporting Date"))
{
     result = test.UniformDateFormat(table, "Reporting Date").ToString();
     Assert.AreSame("2007-06-12", result);
     Console.Write("here");
}

当我运行此测试代码时,我得到以下输出:

  

消息:预期:与" 2007-06-12"相同但是:string.Empty

为了正确运行测试,我需要修改什么?

1 个答案:

答案 0 :(得分:0)

致电......

 result = test.UniformDateFormat(table, "Reporting Date").ToString();
 Assert.AreSame("2007-06-12", result);

...您需要一个完整的DataTable并在其上调用.ToString()。这只是返回其样本中未设置的表名(属性.TableName)。因此,您将日期字符串与空字符串进行比较 - 这正是错误消息所指示的内容。

据我所知,该方法UniformDateFormat只是格式化日期值。您不应该使用其返回值,而是循环遍历数据行并比较列中的值"报告日期"用你的日期字符串。

我看到你尝试了类似的东西,但你的第一个循环结束到早。检查如下:

// format the dates BEFORE the loop
test.UniformDateFormat(table, "Reporting Date");

foreach (DataRow row in table.Rows)
{
    // assert the date values for each row
    string dateValue = row["Reporting Date"].ToString();
    Assert.AreSame("2007-06-12", dateValue);
}

但是,请注意,方法UniformDateFormat不会对DataTable执行任何操作,因为它只会转换日期值,但不会将其写回。