【问题标题】:tSQLt ExpectException doesn't work for metSQLt ExpectException 对我不起作用
【发布时间】:2016-06-08 17:38:38
【问题描述】:

我有一个调用存储过程的测试。我希望存储过程拒绝提供的输入,并带有 raiserror。 我的 tSQLt 测试的相关部分是:

EXEC tSQLt.ExpectException @ExpectedMessagePattern = '%more than one 子类别%';
EXEC usp_add_rfx_rfx 很多,的,参数,在这里

tSQLt 的测试结果取决于 usp_add_rfx_rfx sp 中 raiserror 的严重性。

如果严重性为 12 或更高,则测试失败并显示以下消息:

[test_RFX_configuration].[test_multiple_categories_and_lots] 失败: (错误)EXECUTE 后的事务计数指示数字不匹配 BEGIN 和 COMMIT 语句。先前计数 = 1,当前计数 = 0.[16,2]{test_multiple_categories_and_lots,0}(还有一个 ROLLBACK ERROR --> ROLLBACK TRANSACTION 请求没有 相应的 BEGIN TRANSACTION.{Private_RunTest,149})

如果严重性较小,则测试失败如下:

[test_RFX_configuration].[test_multiple_categories_and_lots] 失败: (失败)预期会引发错误。

我已经用谷歌搜索了这个问题并尝试了一些我发现的东西 - 使用 TRY-CATCH 等,但没有任何乐趣。有什么想法吗?

【问题讨论】:

    标签: sql sql-server-2008 tsqlt


    【解决方案1】:

    该错误看起来像被测存储过程 (ups_add_rfx_rfx) 有它自己的内置事务处理。关于堆栈溢出How to ROLLBACK a transaction when testing using tSQLt 和这个问题有类似的问题 Sebastien,tSQLt 的作者之一链接到他自己的一篇博客文章解决该问题的一种方法how to rollback in procedures

    【讨论】:

    • 感谢您的建议,以数据为中心。我已经阅读了问题和链接的文章,并探讨了塞巴斯蒂安的建议。我已经尝试了问题中建议的每一个答案! ups_add_rfx_rfx 确实有事务处理,但 raiserror 发生在 BEGIN TRANSACTION 之前。我从 usp_add_rfx_rfx 中删除了交易进行分析,但并没有解决问题。我的结论是 tSQLt 事务直接受到 raiserror 的影响。
    • 您最好的选择是发布代码——存储过程(或仍然存在错误的缩小版本)和测试,然后也许我们可以找到问题的根源——或者找到一个解决问题。我使用的模式与 Sebastien (IIRC) 最初建议的模式略有不同,所以如果你发布你的代码,我会尝试在我的环境中重新创建问题,看看我的模式是否能解决问题
    • 以数据为中心 - 当我回去检查时,我意识到在我所有的修复过程中,事务最终又被打开了。
    • 如您所料,我的 catch 块中发生了额外的回滚。我分离了 try-catch 块 - 一个用于前提条件 - 一个用于事务代码。在此更改之后,ExpectException 在我的测试中得到满足。它仍然不太正确 - 抛出的实际异常不是我期望的异常,可能是因为中间有一个日志记录功能。没关系。首先运行 ExpectNoException 测试,然后我可以只更改相关参数并验证是否引发了异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 2015-03-05
    • 2018-06-14
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多