2012-02-23 38 views
5

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

我使用tSQLt.AssertEqualsTable SP评估结果,所以我想确保列值在两者中都是相同的。

在实践中,我已经解决此通过不使用FakeTable工作,但(在http://sqlity.net/en/585/how-to-rollback-in-procedures/%的博客文章)使用(部分)ROLLBACK TRANSACTION语句在测试结束或显式删除测试值。

我敢肯定,这个测试必须有更好的编码方式,并且欢迎任何建议。

回答

4

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

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

顺便说一句,您不需要在测试中回滚任何内容。 tSQLt已经处理好了。您提到的文章中描述的逻辑仅在您自己的过程中需要,如果事务管理是该过程的一个要求。

+0

谢谢Sabastian,这非常有帮助。我试图把这两个测试结合起来,但是当你指出这些应该是不同的测试。 – DaveGreen 2012-02-27 09:18:21

3

现在有一个预发布更新tSQLt邮件列表上可用:http://groups.google.com/group/tsqlt

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

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

这些将很快准备好正式发布。