尝试FakeTable同义词表时,tSQLt失败

时间:2012-04-23 17:52:58

标签: sql tsql tsqlt

我正在使用tSQLt(通过Red Gate的SQL测试版1.0.0.455)。 tSQLt安装在数据库A上。我试图通过数据库A上的同义词在同一SQL服务器实例上的数据库B中的表上执行tSQLt.FakeTable。

代码:

  

ALTER PROCEDURE [ErrorType109NonTankHasSizeOrVolume]。[test AliasTest]   AS

     

BEGIN
     Exec tSQLt.FakeTable' dbo.Bygning';

     

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

     

EXEC tSQLt.AssertEquals 1,1   END;

其中dbo.Bygning是数据库A中的同义词,引用数据库B中的表,ObjStatusdbo.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同义词表?

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

在汇编部分:

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

然后在行为部分结束时清理:

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

这对我有用。试图使用该同义词的并发进程可能有副作用,但我只在开发环境中运行我的测试,所以我并不担心。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我也遇到过类似的问题。 我有2个数据库,即config和main db 我在配置数据库中有一个表“ tableA”。并且其同义词是在主db中创建的,名称相同,即dbo.tableA。但是当嘲笑这个同义词时,却给了我同样的错误。所以这是对我有用的解决方案。

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

CREATE SYNONYM tSQLt.tSqltFakeTable_config FOR [Config_db].tSQLt.faketable

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

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只会有1个问题。您必须跟踪所有这些新的同义​​词并先将其删除,然后才能从Config db卸载tSQLt。 欢迎提出建议。