1

我正在尝试实现一个 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

我想在我处理错误的过程中测试将错误插入到 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,它会传递异常,但不会对 ErrorLog 结果执行 AssertEquals。

有没有办法解决这个问题?

4

1 回答 1

0

为此,我建议围绕 RAISERROR 创建一个包装类,例如 Utils.GenerateError(@error, @serverity, @state),它又调用 RAISERROR。这样你就可以简单地使用 EXEX tSQLt.SpyProcedure 'Utils.GenerateError' 来模拟出实际引发错误的代码。请注意,由于您现在不再实际抛出错误,因此在测试中调用 ExpectException 将毫无意义。您可以检查是否将正确的参数传递给您的间谍程序。测试 Utils.GenerateError 也是一个非常简单的练习。

于 2013-10-02T07:53:09.067 回答