tSQLt 如何判断 table 是否被伪造

tSQLt How can I tell if a table has been faked

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

如果我伪造了 table,

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

我可以检查它是否被伪造了吗?

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

动机

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

我不想在添加数据之前忘记伪造 table(这几乎肯定会导致我无法通过测试)。

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

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

根据您的评论,该工具必须使用以下架构执行类似操作:

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

tSQLt 将扩展的 属性 添加到伪造的 table 以跟踪它伪造的 table。这可以使用函数 tSQLt.Private_GetOriginalTableName:

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

如果 table 不是伪造的,这将 return NULL

如果想做的比较复杂,可以直接查询sys.extended_propertiestSQLt.Private_GetOriginalTableName.

的定义参见tSQLt.class.sql脚本的内容(在tSQLt distribution中)