2017-12-08 30 views
0

tSQLtワールド(新しいツールセット)に新しく、ストアドプロシージャのマイナーな問題が発生しました。私はテストを設定しています。複数のデータベース接続が可能

何らかの理由で、複数のデータベースや複数のSQLサーバー(リンクサーバー)に接続するストアドプロシージャがあるとします。

このようなシナリオでは、tSQLtを使用した単体テストは可能ですか?

+0

を動作しません。あなたは、単一のトランザクション –

答えて

1

すでにコメントしましたが、もう少し追加したいと思います。私がすでに言ったように、あなたは単一の取引に収まる何かをすることができます。

あなたのケースでは、すべてのクロスデータベース/インスタンスオブジェクトに対して同義語を作成し、すべてのシノニムを使用することをお勧めします。

私はビュー/テーブルの同義語をモックするために以下の関数を作成しました。それにはいくつかの制限がありますが、少なくとも単純なユースケースを処理できます。

CREATE PROCEDURE [tSQLt].[FakeSynonymTable] @SynonymTable VARCHAR(MAX) 
AS 
    BEGIN 

     DECLARE @NewName VARCHAR(MAX)= @SynonymTable+REPLACE(CAST(NEWID() AS VARCHAR(100)), '-', ''); 
     DECLARE @RenameCmd VARCHAR(MAX)= 'EXEC sp_rename '''[email protected]+''', '''[email protected]+''';'; 

     EXEC tSQLt.SuppressOutput 
       @RenameCmd; 

     DECLARE @sql VARCHAR(MAX)= 'SELECT * INTO '[email protected]+' FROM '[email protected]+' WHERE 1=2;'; 

     EXEC (@sql); 

     EXEC tSQLt.FakeTable 
       @TableName = @SynonymTable; 
    END; 
+0

グレートに収まる何かを行うことができ、おかげで 私が分散トランザクションに関連するいくつかの余分な疑問を持っていますが、彼らは私のようにスコープの外にありますそれを参照してください – plykkegaard

1

サンプルコードを提供していないと、正確な使用例はわかりませんが、この情報が役立つ場合があります。

データベース間テストの代替アプローチ(両方のデータベースが同じインスタンス上にあると仮定)では、両方のデータベースにtSQLtをインストールします。次に、ローカルの場合と同じ方法でリモートデータベースのオブジェクトをモックできます。

など。 RemoteDbのテーブルを参照するLocalDbのストアドプロシージャがある場合は、次のような操作を行うことができます。

ローカルデータベースのlocalTableというテーブルから行を選択し、その行を(同じインスタンス上で)リモート・データベース内のremoteTableと呼ばれるテーブルは

create procedure [myTests].[test mySproc inserts remoteTable from local table] 
as 
begin 
    -- Mock the local table in the local database 
    exec tSQLt.FakeTable 'dbo.localTable' ; 
    -- Mock the remote table (not the three part object reference to remoteDb) 
    exec RemoteDb.tSQLt.FakeTable 'dbo.remoteTable' ; 

    --! Data setup ommitted 

    --! exec dbo.mySproc @param = 'some value' ; 

    --! Get the data from the remote table into a temp table so we can test it 
    select * into #expected from RemoteDb.dbo.remoteTable; 

    --! Assume we have already populated #actual with our expected results 
    exec tSQLt.AssertEqualsTable '#expected', '#actual' ; 
end 

上記のコードは、基本を示しているが、私は何年か前にhereより詳細にこれについてブログ。

残念ながら、このアプローチは、リンクサーバー間で

+0

ありがとう、はい少しvaqueuされて申し訳ありません 私はこのブログで概説されるようにテストプロジェクトを設定しました: https://kzhendev.wordpress.com/2014/01/08/setting-up-ssdt-database- projects-and-tsqlt/ 基本的には、2つのデータベースプロジェクトがあります.1つは実際の実装用で、もう1つはテストケース用のプロジェクトです。 テストデータベースにtSQLtをインストールし、テストプロジェクトが追加されたテストプロジェクトに追加する必要があります。 シノムムの使用 – plykkegaard

関連する問題