2017-09-15 12 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; 

이 시험은 확인 실행 -하지만 트리거가 내가 원하는 것을하지 않습니다 진입하는 사용자를 방지 값>

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; 

을하지만 지금은 테스트가 아니요 일치하도록 TRANSACTION이 BEGIN 것을 A) 오류가 예상 된 (가)와 B)를 알리는 실패! (10) 트리거의이 버전은 내가 원하는 것을 롤백 거래. 이 마지막 오류가 트랜잭션을 둘러싼 tSQLt와 같아서 내 방아쇠가 어떻게 든 방해한다고 생각하지만 기대했던 것이 아닙니다.

누군가 설명하고 어쩌면 내가 올바르게 할 수 있도록 도와 줄 수 있습니까?

답변

1

tSQLt는 현재 자체 트랜잭션에서 테스트를 실행하도록 제한되어 있습니다. 트랜잭션을 테스트 할 때 반갑지 않은 것으로 나타났습니다.

따라서이 테스트를 수행하려면 테스트 내에서 롤백을 건너 뛰고 외부에서 건너 뛰지 않아야합니다.

  1. 제거 트리거에서 문을 처리하는 모든 트랜잭션

    나는이 방법을 제안한다. 트리거는 항상 내부에서 실행되므로 트랜잭션을 시작하지 않아도됩니다.

  2. 당신이 위반 행을 발견하면, 롤백과 RAISERROR
  3. 스파이 해당 절차 자체를 테스트하려면 테스트

에 대한 해당 절차를 수행하는 프로 시저를 호출, 당신은

+0

tSQLt.NewConnection를 사용할 수 있습니다 고마워, 세바스찬! 모든 것을 아주 분명하게 만들었습니다!/Anders –