如何在使用tSQLt进行测试时ROLLBACK事务

zdG*_*eau 5 tsqlt

我最近在调用代码中包含rasierror的过程.raiserror陷入了困境.在raiserror之后,BEGIN TRAN也在同一个try catch块中.如果事务中发生错误,Catch块旨在ROLLBACK事务.这样做的方法是检查@@ TRANCOUNT是否大于0我知道它已经启动了一个事务并且需要ROLLBACK.当使用tSQLt进行测试时,@@ TRANCOUNT始终> 0,因此如果它遇到CATCH块,则执行ROLLBACK并且tSQLt失败(因为tSQLt在事务中运行).当我发出错误并且运行CATCH块时,tSQLt总是无法通过测试.我无法测试正确处理raiserror的方法.您将如何创建可能潜在的ROLLBACK事务的测试用例?

Seb*_*ine 8

正如您所提到的,tSQLt在其自己的事务中运行每个测试.跟踪正在发生的事情依赖于同一事务在测试完成时仍然打开.SQL Server不支持嵌套事务,因此您的过程将回滚所有内容,包括为当前测试存储的框架的状态信息.那时tSQLt只能假设发生了一些非常糟糕的事情.因此,它将测试标记为错误.

如果在打开的事务中调用该过程,则SQL Server本身不会通过抛出错误来阻止过程内的回滚.有关处理这种情况的方法和一些其他信息,请查看我的博客文章,了解如何在程序中回滚.