tSQLt - 如何对错误中的代码进行单元测试Catch代码块

时间:2013-09-12 11:26:01

标签: unit-testing tsqlt

我正在尝试实现一个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中的错误并且不会执行Assert。 如果我包含tSQLt.ExpectException,它会传递Exception,但不会对ErrorLog结果执行AssertEquals。

有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

为了做到这一点,我建议在RAISERROR周围创建一个包装类,比如Utils.GenerateError(@ error,@ server,@ state),后者又调用RAISERROR。这样你就可以简单地使用EXEX tSQLt.SpyProcedure'Utils.GenerateError'来模拟实际引发错误的代码。注意,因为您现在不再实际抛出错误,所以在测试中调用ExpectException是没有意义的。您可以检查是否已将正确的参数传递给您的间谍程序。测试Utils.GenerateError也是一项非常简单的练习。