1

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

如果我伪造了一张桌子,

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

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

请注意,可以在此处找到有关 FakeTable SP 的文档。

动机

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

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

4

2 回答 2

5

tSQLt 将扩展属性添加到伪造的表中以跟踪它伪造的表。这很容易使用函数进行测试tSQLt.Private_GetOriginalTableName

SELECT tSQLt.Private_GetOriginalTableName('dbo','[My Table]')

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

如果想做更复杂的事情,可以sys.extended_properties直接查询。有关. tSQLt.class.sql _ _ _tSQLt.Private_GetOriginalTableName

于 2016-12-15T15:02:36.600 回答
-1

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

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
于 2016-12-15T14:38:17.127 回答