gpt4 book ai didi

tsqlt - 有没有办法在调用 tSQLt.ExpectException 后测试测试中的其他断言?

转载 作者:行者123 更新时间:2023-12-01 13:42:26 28 4
gpt4 key购买 nike

使用 tSQLt 1.0.5873.27393,我正在尝试为存储过程编写 tSQLt 测试,该过程记录在 CATCH 中捕获的错误。在将错误重新抛出到调用 session 之前阻止到日志表。

我可以成功测试使用 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 进行重大重写就无法解决此问题 - 但我在这里询问以防其他人找到解决问题的方法。

最佳答案

你可以按照这种方法:

在测试中,将对测试的存储过程的调用包装在 try/catch 块中。
在 try/catch 块之前,将预期变量设置为 1,将实际变量设置为 0。
在测试 catch 块中,检查日志表是否已填充,如果是,则将实际变量翻转为 1。
在 catch 块之后写断言。

CREATE PROC MyTests.[test ExpectException]
AS
BEGIN
DECLARE @expected bit = 1;
DECLARE @actual bit = 0;

BEGIN TRY
-- call tested SP, make sure it fails
CALL SP..;

-- add safety net, if the SP call doesn't fail then fail the test
RAISERROR('Fail the test', 16, 1);
END TRY
BEGIN CATCH
-- pseudo code
IF EXISTS (SELECT 1 FROM log table)
-> flip @actual to 1
END CATCH

EXEC tSQLt.AssertEquals @expected, @actual
END
GO

关于tsqlt - 有没有办法在调用 tSQLt.ExpectException 后测试测试中的其他断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38853016/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com