我使用完全相同的模式为actual和expected定义了两个表。我将两行插入到预期的表中,I为2,1。
我跑步
INSERT INTO actual EXEC tSQLt.ResultSetFilter 1, '{statement}'要填充实际的then
EXEC tSQLt.AssertEqualsTable @expected = 'expected' , @actual = 'actual'来比较结果。
即使数据的顺序不同( is实际上是1,2),测试也会通过。
通过在测试中添加SELECT * FROM actual和SELECT * FROM expected并使用测试名称‘{ tSQLt.Run }’单独运行测试,我确认了数据是不同的。
有没有人知道这是不是已知的bug?显然,它应该检查每一行,因此应该检查排序。返回的所有其他列都为NULL,只有ID列包含一个值。
发布于 2012-10-18 15:00:07
除非在select语句中指定了order by子句,否则SQL server不能保证排序(请参阅this MSDN page上的顶部项目符号)-尽管在实践中,排序通常是您所期望的。
正因为如此,我认为tSQLt查找不同和相同的行是有意义的,但是检查顺序就没有意义了,否则答案可能会随SQL server的突发奇想而改变,测试将毫无意义(更糟糕的是,间歇性地失败!)。tSQLt user guide on AssertEqualsTable声明它检查表的内容,但不是检查表中的顺序。是什么让你得出结论,订单也应该被检查?我找不到提到这件事的地方。
如果需要检查顺序,可以将预期结果和实际结果都插入到具有标识列的临时表中(或使用ROW_NUMBER)并检查结果表-如果顺序不同,则标识列也不同。
有一种类似的方法记录了here on Greg M Lucas' blog。
不推荐使用不带order by子句的表返回的order (MSDN link) -因此我建议在应用程序对语句的调用中包含一个子句,或者如果返回行的顺序很重要,则在其中包含SP。
https://stackoverflow.com/questions/12931511
复制相似问题