tSQLt如何判断表是否已伪造

时间:2016-12-15 14:17:11

标签: sql sql-server unit-testing ssms tsqlt

我刚刚开始为我的数据库创建一些单元测试。

如果我伪造了一张桌子,

EXEC tSQLt.FakeTable
    @TableName = 'dbo.[My Table]',
    @Identity = 0,
    @ComputedColumns = 0,
    @Defaults = 0

我可以查看它是否已被伪造?

请注意,可以找到关于FakeTable SP的文档here

动机

我希望能够这样做,因为我想创建几个存储过程来填充这些伪造的表,以便我可以执行测试。 但是我不想在存储过程中处理伪造表(因此我可以多次调用它们每次输入不同的信息)。

我不希望在添加数据之前忘记伪造表格(因为这几乎肯定会导致我的测试失败)。

2 个答案:

答案 0 :(得分:3)

tSQLt将一个扩展属性添加到假表中以跟踪它伪造的表。使用函数tSQLt.Private_GetOriginalTableName

可以轻松测试
SELECT tSQLt.Private_GetOriginalTableName('dbo','[My Table]')

如果表格没有伪造,这将返回NULL

如果您想要做一些更复杂的事情,可以直接查询sys.extended_properties。有关tSQLt.class.sql的定义,请参阅tSQLt.Private_GetOriginalTableName脚本的内容(在tSQLt distribution中)。

答案 1 :(得分:0)

您可以在存储过程的开头检查表是否存在。

If Not Exists ( Select 1 From Sys.Objects Where [Name] = 'YOURTABLENAME' And [Type] = 'U')
  Begin
  -- Your Create Table Statement Here
  ENd

根据您的评论,该工具必须使用schema:

执行类似的操作
Create table dbo.MisterPositive ( test int )
Create table developers.MisterPositive (test Int )

-- Both statements below work
Select * From dbo.MisterPositive
Select * From developers.MisterPositive

- 用它来寻找先前的存在

Select 1 from sys.objects
  Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
 where sys.objects.[Name] = 'MisterPositive' And sys.schemas.name = 'dbo'

 Select 1 from sys.objects
  Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
 where sys.objects.[Name] = 'MisterPositive' And sys.schemas.name = 'Developers'

所以你的

 If Not Exists ( Select 1 from sys.objects
  Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
 where sys.objects.[Name] = 'YOURTABLE' And sys.schemas.[Name] = 'tSQLt' )
   Begin
     -- create table here
   End