8

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

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

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

我确信必须有更好的方法来编写这个测试,并欢迎任何建议。

4

2 回答 2

6

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

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

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

于 2012-02-24T01:32:30.777 回答
4

现在在邮件列表中提供了 tSQLt 的预发布更新:http ://groups.google.com/group/tsqlt

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

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

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

于 2012-03-07T02:30:04.127 回答