验证DataTable是否已排序

时间:2011-01-25 19:45:32

标签: .net database unit-testing

我正在研究在Visual Studio中创建自定义数据库测试条件,我正在尝试验证排序顺序。

我在验证DataTable中的行是否实际排序方面没有问题,但我还想验证每个排序列至少有一个具有多个不同值的分组。

我正在维护一个定义排序列的整数列表(负整数表示降序排序 - 整数的绝对值是列号)。

让我澄清一下。

我正在编写一个单元测试条件来验证已排序的DataTable。我可以验证该行是否按正确的排序顺序,但我想验证结果集是否包含实际测试排序的数据。换句话说,只有一行或任意数量的重复行的结果集确实已经排序,但实际上并没有测试排序。

我需要验证排序的每个级别在至少一个分组中至少包含两个不同的值。

过去我使用了SQL和.Net代码的组合,并使用以下一组查询来确保有足够的数据来测试排序。

SELECT TOP 1 COUNT(DISTINCT column1) 
FROM table 
HAVING COUNT(DISTINCT column1) > 1

SELECT TOP 1 column1, COUNT(DISTINCT column2) 
FROM table 
GROUP BY column1 
HAVING COUNT(DISTINCT column2) > 1

SELECT TOP 1 column1, column2, COUNT(DISTINCT column3)
FROM table
GROUP BY column1, column2
HAVING COUNT(DISTINCT column3) > 1

我对每个级别都有查询,并且所有查询都必须返回非空结果集,以便单元测试通过。

我真正的问题是如何将上面的SQL代码复制/转换为LINQ?

2 个答案:

答案 0 :(得分:0)

我认为你验证它是按照

for (int i = 1; i < rowCount; i++) {
    for (int j = 0; j < sortColCount; j++) {
        int col = colNum(sortCols[j]);
        int d = Compare(GetValue(rows[i], col), GetValue(rows[i-1], col));
        if (d == 0) continue;
        // Insert here
        Assert(d == colDir(sortCols[j]));
    }
}
的行进行双循环排序的 你需要做的是我把注释插入一个命令来标记排序列d被测试(使用例如bool数组)。然后在循环断言后测试每个排序列。

答案 1 :(得分:0)

您可以通过挂钩DataTable的TableNewRow,RowChanging和RowChanged事件来跟踪/强制执行DataTable是否按预期方式排序,从而节省必要迭代的成本。

否则,这是蛮力:

foreach ( int i = 1 ; i < dt.Rows.Length ; ++i )
{
  DataRow prev = dt.Rows[i-1] ;
  DataRow curr = dt.Rows[i  ] ;

  Assert( CompareRows(prev,curr) <= 0 ) ;

}

CompareRows(prev,curr)返回通常的比较结果:-1表示prev&lt; curr,0表示prev == curr,+1表示prev&gt; curr);