tsqlt error handling Trumping gespeicherte Prozedur (Einheit) Fehler Handler

Beim Versuch, eine vom Benutzer bereitgestellte GUID innerhalb einer gespeicherten Prozedur zu validieren, wurde ein einfacher Ansatz verwendet; nehmen Sie die Benutzereingabe als CHAR (36) dann explizit CAST es als UNIQUEIDENTIFIER in einem TRY CATCH. Der CATCH bubbtet dann den Fehler mit einer benutzerdefinierten Fehlerbeschreibung mit einem RAISERROR.

Wenn Sie die gespeicherte Prozedur manuell ausführen, wird alles wie erwartet ausgeführt und der Fehler wird erhöht.

Erstellen Sie einen tSQLt-Test, um das Gerät aufzurufen (die Prozedur mit GUID-validation) und behandeln Sie den Fehler, der ausgegeben wird, und vergleichen Sie mit dem erwarteten Fehler, der mit einem Transaktionserrors kontinuierlich fehlschlägt. tSQLt hat einen Fehler erkannt und im tSQLt-Framework behandelt.

Dies deutet darauf hin, dass die Schwere eines Misserfolgs von CAST auf einen anderen datatyp von tSQLt behandelt wird und es verhindert, dass die TRY / CATCH innerhalb der gespeicherten Prozedur damit umgeht. Ähnlich wie verschachtelte Prozeduren ignorieren manchmal die TRY / CATCH innerhalb der Kindprozedur und blasen bis zum Elternverfahren auf; Beispiel, wenn das Kind proc. verweist auf eine Tabelle, die nicht existiert.

Hat jemand ein ähnliches Problem? Einfach nur, um mein aktuelles Denken zu bestätigen.

Ich habe den Test entfernt und es wird an anderer Stelle getestet, aber das hat mir ein "Loch" verursacht, dass es meine DB-Unit-Tests

Schließlich denke ich, ich sollte erwähnen, dass ich weiß, dass ich eine andere validation auf einem gelieferten CHAR-Parameter, anders als ein CAST, ausführen kann und einen Fehler auf diese Weise anhebe, aber das ist eine tSQLt-Abfrage und keine TSQL-Abfrage.

BEARBEITEN

Beispiel für den Code:

@sGUID ist ein CHAR (36) und ist ein Parameter, der an die Prozedur übergeben wird.

BEGIN TRY SELECT CAST(@sGUID AS UNIQUEIDENTIFIER) END TRY BEGIN CATCH RAISERROR('Invalid GUID format',16,1) END CATCH 

Die SELECT-Zeile triggers niemals den CATCH aus tSQLt scheint vor der Hand zu intervenieren und den ROLLBACK-Transaktionserrors zu casting.

Wenn du RAISEERROR () anrufst, beendest du die Transaktion, die tSQLt läuft -> also der Transaktionserrors, den du siehst.

Um dies für den Zweck der Unit-Testung zu verbessern, wäre eine Option, die Sie in Erwägung ziehen könnten, die RAISEERROR () – statement durch einen Aufruf einer benutzerdefinierten gespeicherten Prozedur zu replace, die nur RAISERROR () enthält. Auf diese Weise können Sie diese gespeicherte Prozedur separat testing.

 BEGIN TRY SELECT CAST(@sGUID AS UNIQUEIDENTIFIER) END TRY BEGIN CATCH EXEC dbo.customprocedure --RAISERROR('Invalid GUID format',16,1) END CATCH