尝试伪造同义词表时tSQLt失败

尝试伪造同义词表时tSQLt失败,sql,tsql,tsqlt,Sql,Tsql,Tsqlt,我正在使用tSQLt(通过RedGate的SQL测试版本1.0.0.455)。tSQLt安装在数据库A上。我正在尝试通过数据库A上的同义词对同一SQL server实例上的数据库B中的表执行tSQLt.FakeTable 代码: 更改过程[ErrorType109NonTankHasSizeOrVolume]。[test AliasTest] 作为 开始 Exec tSQLt.FakeTable“dbo.Bygning” 插入dbo.Bygning(ObjStatus)值(1) EXEC tSQ

我正在使用tSQLt(通过RedGate的SQL测试版本1.0.0.455)。tSQLt安装在数据库A上。我正在尝试通过数据库A上的同义词对同一SQL server实例上的数据库B中的表执行tSQLt.FakeTable

代码:

更改过程[ErrorType109NonTankHasSizeOrVolume]。[test AliasTest] 作为

开始
Exec tSQLt.FakeTable“dbo.Bygning”

插入dbo.Bygning(ObjStatus)值(1)

EXEC tSQLt.AssertEquals 1,1
结束

其中,
dbo.Bygning
是数据库a中的同义词,指数据库B中的表,
ObjStatus
dbo.Bygning

错误消息:

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1.

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1.

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1.

[ErrorType109NonTankHasSizeOrVolume].[test AliasTest] failed: An invalid parameter or option was specified for procedure 'sp_addextendedproperty'.{sp_addextendedproperty,37}
有没有办法找到tSQLt.FakeTable同义词表

澄清:
运行测试时会出现错误消息。

tSQLt目前不支持伪造同义词。然而,我认为为它添加支持可能很容易。我很快制作了以下修复原型,希望它能解决您的问题。你能试试并确认一下吗?如果它适合你,我会确保它进入下一个版本

ALTER PROCEDURE tSQLt.Private_MarkFakeTable
  @SchemaName NVARCHAR(MAX),
  @TableName NVARCHAR(MAX),
  @NewNameOfOriginalTable NVARCHAR(4000)
AS
BEGIN
   DECLARE @UnquotedSchemaName NVARCHAR(MAX);SET @UnquotedSchemaName = OBJECT_SCHEMA_NAME(OBJECT_ID(@SchemaName+'.'+@TableName));
   DECLARE @UnquotedTableName NVARCHAR(MAX);SET @UnquotedTableName = OBJECT_NAME(OBJECT_ID(@SchemaName+'.'+@TableName));
   DECLARE @Level1Type NVARCHAR(MAX);

   SELECT @Level1Type = 
     CASE type
       WHEN 'SN' THEN 'SYNONYM'
       ELSE 'TABLE'
     END
   FROM sys.objects
   WHERE object_id = OBJECT_ID(@SchemaName+'.'+@TableName);


   EXEC sys.sp_addextendedproperty 
      @name = N'tSQLt.FakeTable_OrgTableName', 
      @value = @NewNameOfOriginalTable, 
      @level0type = N'SCHEMA', @level0name = @UnquotedSchemaName, 
      @level1type = N'TABLE',  @level1name = @UnquotedTableName;
END;
GO

我今天遇到了这个问题,并设计了以下解决方案

在组装部分:

CREATE TABLE #mock
(
    id_item VARCHAR(15),
    descr_1 VARCHAR(50)
)
INSERT INTO #mock
  ( id_item, descr_1 )
VALUES ('123456-01', 'Great description here'),
       ('123456-02', 'Blue, gnarly, cloud')
EXEC sp_rename 'syn_name', 'syn_name_orig'
CREATE SYNONYM syn_name FOR #mock
然后在act部分末尾进行清理:

DROP SYNONYM syn_name
EXEC sp_rename 'syn_name_orig', 'syn_name'

这对我有用。可能会对尝试使用该同义词的并发进程产生副作用,但我只在开发环境中运行测试,因此我不担心它。

我使用的解决方法是将生产代码更改为使用视图,然后使用同义词。然后我可以使用tSQLt.FakeTable模拟视图。

我也遇到过类似的问题。 我有两个数据库,即配置数据库和主数据库 我在配置数据库中有一个表“tableA”。其同义词在主数据库中以相同的名称创建,即dbo.tableA。但在嘲弄这个同义词时,它给了我同样的错误。这是我的解决方案,对我来说很有效

首先,我已将配置数据库中的tSQLt.FakeTable sp的同义词创建到主数据库中 例如

现在在测试用例中,我使用了新的同义词tSQLt.tSqltFakeTable_config来伪造“tabla”的同义词

CREATE PROC [testclass].[test faking synonym which points to another db] 
AS
BEGIN
    --arrange
    exec [tSQLt].tSqltFakeTable_config 'dbo.tableA';

    --act

    --assert

END
但我觉得如果从config db卸载tSQLt,只有一个问题。您必须跟踪所有这些新的同义词并首先删除它们,然后才能从Config db中卸载tSQLt。
欢迎提出建议。

EXEC tSQLt.AsserEquals 1,1
不需要包含在代码示例中。这一行永远不会到达(失败以前发生过)。在同一会话中,您是否在这一行之前运行了其他SQL语句?不,我在打开Management Studio后运行了测试。在进一步调查中,这将不起作用,因为当它尝试创建假表时,将找不到列。我会继续深入研究这个问题,看看是否能找到解决办法。谢谢。我们将不胜感激。我可以确认代码没有按照发布的那样工作。然而,您的回答“tSQLt目前不支持伪造同义词。”是正确的。我将调整问题以包括版本号。
CREATE PROC [testclass].[test faking synonym which points to another db] 
AS
BEGIN
    --arrange
    exec [tSQLt].tSqltFakeTable_config 'dbo.tableA';

    --act

    --assert

END