簡體   English   中英

tSQLt-如何對錯誤的Catch代碼塊中的代碼進行單元測試

[英]tSQLt - How to do a unit test on code in an error Catch block of code

我正在嘗試實現UnitTest來測試我們是否將數據記錄在代碼塊中,該代碼塊還會引發異常:

所以代碼看起來像這樣:

--CREATE TABLE dbo.ErrorLog (ID int IDENTITY (1,1), ErrorDescription Varchar(100))
GO
ALTER PROCEDURE dbo.TestError
AS
DECLARE @Error varchar(100) = 'one is not equal to two'
--do some work
IF 1 <> 2
  BEGIN 
    INSERT dbo.ErrorLog (ErrorDescription) VALUES (@error)
    RAISERROR (@Error,16,1)
    RETURN
  END
GO

我想在我處理錯誤的proc時測試將錯誤插入到ErrorLog中。 所以我寫了這樣的測試:

EXEC tSQLt.NewTestClass 'Error'
GO

CREATE PROCEDURE error.test_GivenError_LogResult
AS
--Arrange
EXEC tSQLt.FakeTable 'dbo.ErrorLog'
DECLARE @Actual varchar(100)
DECLARE @Expected Varchar(100) = ('one is not equal to two')

--Act
--EXEC tSQLt.ExpectException @ExpectedMessage = 'one is not equal to two'

EXEC dbo.TestError
SELECT top 1 @Actual = ErrorDescription FROM dbo.ErrorLog

--ASSERT

EXEC tSQLt.AssertEquals @Expected, @Actual 
GO

EXEC tsqlt.Run 'Error'

當我按照上面的步驟執行此測試時,它會在proc中報告一個錯誤,並且不會執行斷言。 如果我包含tSQLt.ExpectException,它將傳遞Exception,但不會對ErrorLog結果執行AssertEquals。

有辦法解決這個問題嗎?

為此,我建議創建一個圍繞RAISERROR的包裝類,例如Utils.GenerateError(@error,@serverity,@state),該類又將調用RAISERROR。 這樣,您可以簡單地使用EXEX tSQLt.SpyProcedure'Utils.GenerateError'來模擬出實際上引發錯誤的代碼。 請注意,由於您現在不再實際拋出錯誤,因此在測試中調用ExpectException將毫無意義。 您可以檢查是否將正確的參數傳遞給了您的間諜程序。 測試Utils.GenerateError也是一個非常簡單的練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM