debugging 是否可以轻松地为单元测试生成DataTable数据?

1hdlvixo  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(105)

谢谢你的阅读。我想对一些函数进行单元测试,这些函数是用Datatable作为输入参数的。
但是,在程序中,数据表是由数据库创建的。所以,我想为单元测试制作一个数据表数据样本。
但是,这很难。因为,有20列。所以,当我打所有的列和每一行,我觉得这真的是浪费时间。
我可以轻松地为单元测试创建数据表数据吗?例如,在调试模式下,有一个包含数据的数据表。我想使用类似“将数据表数据作为代码”按钮的功能。然后,数据表就在那一刻创建了。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------所以很难输入所有的数据。还有其他的方法吗?

oyxsuwqo

oyxsuwqo1#

对于这个任务我有两个解决方案,你可以选择一个更适合你的。

public class Person
{
public string Name { get; set; }
public int Rank { get; set; }
}

 public static DataTable getTestTableFromList()
{
    List<Person> list = new List<Person> { new Person { Name = "Bob", Rank = 5 }, new Person { Name = "Jack", Rank = 7 } };
    DataTable result = convertListToDT(list);
    return result;
}
private static DataTable convertListToDT<T>(IEnumerable<T> listToConvert)
{
    Type type = typeof(T);
    var tpProp = type.GetProperties();

    DataTable resultTable = new DataTable();
    foreach (PropertyInfo pi in tpProp)
    {
        resultTable.Columns.Add(new DataColumn(pi.Name, pi.PropertyType));
    }

    foreach (T listRow in listToConvert)
    {
        object[] obArr = new object[tpProp.Length];
        for (int i = 0; i < tpProp.Length; i++)
        {
            obArr[i] = tpProp[i].GetValue(listRow, null);
        }

        resultTable.Rows.Add(obArr);
    }

    return resultTable;
}

public static DataTable getTestTableFromCsv()
{
List<Type> typesList = new List<Type>() { typeof(int), typeof(string), typeof(string), typeof(float), typeof(DateTime) };
string csv =
@"0,'Chocolate','Cake',8.95,'1927-07-11'
1,'Lemon','Cake',8.95,'1998-11-12'
2,'Casino','Cake',15.95,'2011-01-15'
3,'Opera','Cake',15.95,'2014-12-08'
4,'Strawberry','Cake',11.95,'2015-09-18'
5,'Truffle','Cake',15.95,'1979-08-03'
6,'Chocolate','Eclair',3.25,'1973-07-05'
7,'Coffee','Eclair',3.5,'1991-05-07'
8,'Vanilla','Eclair',3.25,'1989-03-11'
9,'Napoleon','Cake',13.49,'1977-01-13'
10,'Almond','Tart',3.75,'1979-04-17'
11,'Apple','Pie',5.25,'1981-02-19'";
string[] csvArr = csv.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
DataTable result = new DataTable();
for (int ic = 0; ic < typesList.Count; ic++)
{
    DataColumn iColumn = new DataColumn("Column_" + ic.ToString(), typesList[ic]);
    result.Columns.Add(iColumn);
}
for (int ir = 0; ir < csvArr.Length; ir++)
{
    DataRow row = result.NewRow();
    string[] values = csvArr[ir].Split(',');
    for (int col = 0; col < result.Columns.Count; col++)
    {
        Type tp = result.Columns[col].DataType;
        if (tp == typeof(int))
        {
            row[col] = int.Parse(values[col]);
        }
        if (tp == typeof(string))
        {
            row[col] = values[col].Replace("'", "").Trim();
        }
        if (tp == typeof(float))
        {
            string str = values[col];                        
            row[col] = float.Parse(str,CultureInfo.InvariantCulture);
        }
        if (tp == typeof(DateTime))
        {
            string str = values[col].Replace("'","").Trim();
            DateTime curDate = DateTime.Parse(str, System.Globalization.CultureInfo.InvariantCulture);
            row[col] = curDate;
        }
        
    }
    result.Rows.Add(row);
}
return result;
}

相关问题