0

私は jsut が tSQLt の使用を開始し、トリガーをテストしようとしています。FakeTable プロシージャを呼び出してテストを実行しましたが、トリガーが実行されません。FakeTable を使用しない場合、トリガーが実行されます。それは本当に悪いようで、それらを再読み込みする方法があるという情報を見つけることができません.

次に、トリガーが FakeTable によって削除されたと思いましたが、呼び出し後にトリガーを再作成し、テストで次のコードを実行しました。

DECLARE @createTrigger NVARCHAR(MAX);
SELECT @createTrigger = OBJECT_DEFINITION(OBJECT_ID('MoveDataFromAToB'))    
EXEC tSQLt.FakeTable 'dbo.A';
EXEC(@createTrigger);

次のエラーが発生しました:「データベースには、'MoveDataFromAToB' という名前のオブジェクトが既に存在します。{MoveDataFromAToB,14} (ROLLBACK ERROR もありました --> 現在のトランザクションをコミットできず、セーブポイントにロールバックできません。トランザクション全体をロールバックします。{Private_RunTest,60})"

tSQLt の経験があり、この問題の回避策を知っている人はいますか?

4

2 に答える 2

2

tSQLt バックログに ApplyTrigger メソッドがありますが、まだ完了していません。今のところ、テストでこのコードを使用できるはずです。

DECLARE @createTrigger NVARCHAR(MAX);
SELECT @createTrigger = OBJECT_DEFINITION(OBJECT_ID('MoveDataFromAToB'));
DROP TRIGGER MoveDataFromAToB;    
EXEC tSQLt.FakeTable 'dbo.A';
EXEC(@createTrigger);

FakeTable は元のテーブルを削除しないため、既存のトリガーを削除する必要があります。名前を変更するだけで、古いトリガーはそのまま残ります。したがって、あなたが見た名前の衝突。

すべてのテストの最後に tSQLt が実行するロールバックは、削除されたトリガーを元の場所に戻します (コードで何か悪いことをしていない限り)。それが心配な場合は、トリガーにドロップする代わりに sp_rename を使用してください。

これらすべてをテスト クラス内のヘルパー ストアド プロシージャに入れ、それを必要とするテストから呼び出します。そうすれば、tSQLt に実装されたより良いソリューションが得られたら、コード内の 1 か所だけを変更する必要があります。

于 2012-11-25T23:03:01.167 に答える
0

セバスチャン、答えてくれてありがとう。それは私にも本当に役立ちました:)私はあなたが与えたコードのストアドプロシージャを作成しました。「ApplyTrigger」機能が利用可能になるまで、これを使用します。

CREATE PROCEDURE [tSQLt].[FakeTableWithTrigger]
    @TableName NVARCHAR(MAX),
    @TriggerName NVARCHAR(MAX),
    @SchemaName NVARCHAR(MAX) = NULL, --parameter preserved for backward compatibility. Do not use. Will be removed soon.
    @Identity BIT = NULL,
    @ComputedColumns BIT = NULL,
    @Defaults BIT = NULL
AS
BEGIN
   DECLARE @createTrigger NVARCHAR(MAX);
    SELECT @createTrigger = OBJECT_DEFINITION(OBJECT_ID(@TriggerName));
    EXEC('DROP TRIGGER ' + @TriggerName);    
    EXEC tSQLt.FakeTable @TableName, @SchemaName, @Identity, @ComputedColumns, @Defaults;
    EXEC(@createTrigger);   
END

テストでの使用例は次のとおりです。

exec tSQLt.FakeTableWithTrigger 'dbo.MyTable', 'MyTable_SyncTrigger', @Identity = 1
于 2012-11-27T08:46:41.990 に答える