2017-09-15 4 views
1

をテスト:tSQLt、トリガー、私はこの問題を回避私の脳をラップしようとしましたが、それを動作させることができないので、私はここで少しテストケースを提示し、うまくいけば、誰かが私にそれを説明することができ

まず少しテスト・データベース:

CREATE DATABASE test; 
USE test; 
CREATE TABLE testA (nr INT) 
GO 

CREATE TRIGGER triggerTestA 
ON testA 
FOR INSERT AS BEGIN 
    SET NOCOUNT ON; 
    IF EXISTS (SELECT nr FROM Inserted WHERE nr > 10) 
    RAISERROR('Too high number!', 16, 1); 
END; 

そして、ここでは、TSQLのテストで、動作をテストするには:

ALTER PROCEDURE [mytests].[test1] AS 
BEGIN 
    EXEC tSQLt.FakeTable @TableName = N'testA' 
    EXEC tSQLt.ApplyTrigger 
    @TableName = N'testA', 
    @TriggerName ='triggerTestA' 
    EXEC tSQLt.ExpectException 
    INSERT INTO dbo.testA VALUES (12) 
END; 

このテストは、[OK]を実行します - しかし、トリガは、私がやりたいことはありません:侵入からユーザーを防ぎます値> 10トリガこのバージョンの私が欲しいものを行います!

CREATE TRIGGER triggerTestA 
ON testA FOR INSERT AS BEGIN 
    SET NOCOUNT ON; 
    BEGIN TRANSACTION; 
    BEGIN TRY 
    IF EXISTS (SELECT nr FROM Inserted WHERE nr > 10) 
     RAISERROR('Too high number!', 16, 1); 
    COMMIT TRANSACTION; 
    END TRY 
    BEGIN CATCH 
    ROLLBACK TRANSACTION; 
    THROW; 
    END CATCH; 
END; 

しかし、今のテストが失敗し、Aを述べる)期待されたエラーが(あり)とB)と一致するBEGIN TRANSACTIONをには存在しないことロールバック取引。私はこの最後のエラーは、トランザクションを囲むtSQLtで、私のトリガーは何とかそれを妨害すると思いますが、それは私が期待するものではないと確信しています。

誰かが説明し、私がそれを正しくする手助けをすることができますか?

答えて

1

現在、tSQLtは独自のトランザクションでテストを実行するように制限されていますが、これまでのように、トランザクションを試すときに不快な反応を示しています。

このテストを行うには、テスト内でロールバックをスキップする必要がありますが、外部では実行しないでください。

私はこのアプローチをお勧め:

  1. トリガーからの文を扱うすべてのトランザクションを削除します。トリガーは常に1つの内部で実行されるため、トランザクションを開始する必要はありません。
  2. あなたが違反した行を見つけた場合は、ロールバックとRAISERROR
  3. スパイその手順自体をテストするためにテスト

のためにその手順を行うプロシージャを呼び出すには、

+0

tSQLt.NewConnectionを使用することができますありがとう、セバスチャン!それをすべて非常に明確にしました! /アンダース –

関連する問題