4

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

代码:

ALTER PROCEDURE [ErrorType109NonTankHasSizeOrVolume].[test AliasTest] AS

开始执行tSQLt.FakeTable
'dbo.Bygning';

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

执行 tSQLt.AssertEquals 1, 1
END;

数据库 A 中的同义词在哪里dbo.Bygning是指数据库 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 同义词表?

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

4

4 回答 4

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
于 2012-04-24T00:35:58.483 回答
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

然后在 act 部分的末尾进行清理:

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

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

于 2012-05-01T20:32:53.487 回答
2

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

于 2013-09-03T06:31:22.700 回答
0

我也遇到过类似的问题。我有 2 个数据库,即 config 和 main db 我在 config db 中有一个表“tableA”。它的同义词是在主数据库中创建的,具有相同的名称,即 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。欢迎提出建议。

于 2020-07-27T12:51:01.630 回答