我正在尝试实现一个 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
我想在处理错误时测试错误插入错误日志。所以我把我的测试写成这样:
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,它会传递异常,但不会对ErrorLog结果执行AssertEquals。
有没有办法解决这个问题?
我建议围绕RAISERROR创建一个包装类,例如Utils.GenerateError(@error,@serverity,@state),该类又调用RAISERROR。 这样,您可以简单地使用EXEX tSQLt.SpyProcedure 'Utils.GenerateError'来模拟实际引发错误的代码。请注意,由于您现在实际上不再会抛出错误,因此在测试中调用 ExpectException 是没有意义的。 您可以检查是否已将正确的参数传递给间谍过程。 测试 Utils.GenerateError 也将是一个非常微不足道的练习。