4

私は tSQLt を使用しています (Red Gate の SQL テスト バージョン 1.0.0.455 を使用)。tSQLt はデータベース A にインストールされています。データベース A のシノニムを使用して、同じ SQL サーバー インスタンスのデータベース B のテーブルで tSQLt.FakeTable を実行しようとしています。

コード:

ALTER PROCEDURE [ErrorType109NonTankHasSizeOrVolume].[テスト AliasTest] AS

BEGIN
Exec tSQLt.FakeTable 'dbo.Bygning';

dbo.Bygning (ObjStatus) 値 (1) に挿入します。

EXEC tSQLt.AssertEquals 1, 1
END;

dbo.Bygningは、データベース B のテーブルを参照するデータベース A のシノニムであり、データベースの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

次に、行為セクションの最後でクリーンアップします。

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 に答える