【发布时间】:2023-03-31 12:47:01
【问题描述】:
使用 tSQLt 1.0.5873.27393,我正在尝试为存储过程编写 tSQLt 测试,该存储过程将捕获在 CATCH 块中的错误记录到日志表中,然后再将错误重新抛出到调用会话。
我可以成功测试使用tSQLt.ExpectException 重新抛出错误消息,但副作用似乎是在调用tSQLt.ExpectException 后无法测试任何其他断言 - 所以我无法测试是否错误已写入日志表。
我能想出的证明问题的最简单的测试是:
CREATE PROC MyTests.[test ExpectException]
AS
BEGIN
EXEC tSQLt.ExpectException;
THROW 50001, 'Error message',1
EXEC tSQLt.AssertEquals 0,1, '0=1'
END
GO
执行时会产生以下(意外)输出:
|No|Test Case Name |Dur(ms)|Result |
+--+--------------------------------+-------+-------+
|1 |[MyTests].[test ExpectException]| 3|Success|
使用分析器跟踪,我可以看到AssertEquals 断言从未执行,因为错误被CATCH 块在tSQLt.Private_RunTest 中捕获。
因为 tSQLt 使用 CATCH 来捕获错误,我怀疑如果不对 tSQLt 进行重大重写,就无法解决这个问题 - 但我在这里询问以防其他人找到解决问题的方法。
【问题讨论】:
-
建议/最佳实践:让您的测试尽可能原子化(一次测试一件事)。我会将这个场景分成两个测试(一个用于错误,一个用于日志记录)。
-
@EduardUta - 如果可以的话,我会这样做,但在这种情况下,这是不可能的;我正在测试的代码路径只有在抛出错误时才会执行,并且错误总是随后会重新抛出。
-
是的,你可以。一个使用 ExpectException 的测试,另一个使用 TRY...CATCH 方法只查看日志表。
-
@SebastianMeine - 感谢您的澄清
标签: tsqlt