在计算列上使用tSQLt进行单元测试

时间:2012-02-23 15:15:20

标签: sql-server tdd tsqlt

我一直在编写一些tSQLt数据库单元测试(通过Red Gate SQL Test)来调试最近调用包含(持久)计算列的表的过程,并注意如果我使用FakeTable SP,我发现计算列是未填充(它们评估为null)。计算列是测试的关键,所以我不能忽略测试中的列,我宁愿不复制逻辑。

我正在使用tSQLt.AssertEqualsTable SP评估结果,因此我想确保两者中的列值相同。

在实践中,我通过不使用FakeTable来解决这个问题,但是在测试结束时使用(部分)回滚事务语句(根据http://sqlity.net/en/585/how-to-rollback-in-procedures/的博客文章)或明确删除测试值。

我确信必须有更好的方法对此测试进行编码,并欢迎任何建议。

2 个答案:

答案 0 :(得分:4)

在测试时,您应该将计算列中的逻辑与过程中的逻辑分开。该过程将采用该列中的信息并对其进行操作。该过程不应关心列是计算列还是实列。这意味着,在您的测试中,您可以对要放入该列的值进行硬编码。 FakeTable通过将任何计算列转换为实际列来实现这一点。

在另一组测试中,您可以(并且应该)测试计算列是否正确计算。 为此,可以添加FakeTable。这保留了表的计算属性。您需要将EXECUTE tSQLt.FakeTable的@ComputedColumn参数设置为1.(http://tsqlt.org/user-guide/isolating-dependencies/faketable/

顺便说一下,你不需要在测试中回滚任何东西。 tSQLt已经在处理这个问题了。如果事务管理是该proc的要求,那么您提到的文章中描述的逻辑仅在您自己的过程中需要。

答案 1 :(得分:3)

现在可以在邮件列表上找到tSQLt的预发布更新:http://groups.google.com/group/tsqlt

预发行版包含在FakeTable期间保留计算列或默认值的功能。

例子:
EXEC tSQLt.FakeTable'dbo.tst1',@ ComputedColumns = 1;
EXEC tSQLt.FakeTable'dbo.tst1',@ Defaults = 1;

这些将很快正式发布。