每当我使用ExpectException时,我收到以下错误:(还有一个ROLLBACK错误 - >当前事务无法提交,无法回滚到保存点.回滚整个事务.{Private_RunTest,140})
看来,由于RAISERROR,MSSQL已经执行了ROLLBACK,因此tSQLt正在尝试ROLLBACK.我裹着Private_RunTest下面的SELECT和SET语句与以下IF语句和它似乎解决问题.
IF ISNULL(@ExpectException,0) <> 1
BEGIN
SELECT @Msg = COALESCE(@Msg, '') + ' (There was also a ROLLBACK ERROR --> ' +
COALESCE(ERROR_MESSAGE(), '') + '{' +
COALESCE(ERROR_PROCEDURE(), '') + ',' +
COALESCE(CAST(ERROR_LINE() AS NVARCHAR), '') + '})';
SET @Result = 'Error';
END
Run Code Online (Sandbox Code Playgroud)
这真的是一个错误和/或一个适当的修复?
小智 5
您可能没有在tsqlt测试中使用TRY/CATCH块.
错误消息" 还有一个ROLLBACK错误 - >当前事务无法提交,无法回滚到保存点.回滚整个事务. "可以重现如下:
1)创建一个抛出错误并按如下方式回滚的触发器:
CREATE TRIGGER [dbo].[MyTable_IUDTR] ON [dbo].[MyTable]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
BEGIN TRY
RAISERROR('MyError', 16, 1)
END TRY
BEGIN CATCH
THROW;
END CATCH
END
GO
Run Code Online (Sandbox Code Playgroud)
2)创建tsqlt测试以检查返回的错误消息:
CREATE PROC [ut_MyTable_IUDTR].[test that the error is returned]
AS
BEGIN
DECLARE @ErrorMsg VARCHAR(50)
EXEC tsqlt.FakeTable @TableName = 'MyTable'
EXEC tsqlt.ApplyTrigger 'MyTable', 'MyTable_IUDTR'
INSERT INTO dbo.MyTable
( FirstName, LastName )
VALUES ( N'John',N'Smith')
SET @ErrorMsg = ERROR_MESSAGE()
EXEC tSQLt.AssertEqualsString @Expected = 'MyError', @Actual = @ErrorMsg
END
GO
Run Code Online (Sandbox Code Playgroud)
3)运行测试:
EXEC [tSQLt].Run 'ut_MyTable_IUDTR.test that the error is returned'
Run Code Online (Sandbox Code Playgroud)
4)您收到以下错误:
There was also a ROLLBACK ERROR --> The current transaction cannot be committed and cannot be rolled back to a savepoint. Roll back the entire transaction.
Run Code Online (Sandbox Code Playgroud)
固定:
更改tsqlt测试以包含TRY/CATCH块,如下所示:
ALTER PROC [ut_MyTable_IUDTR].[test that the error is returned]
AS
BEGIN
DECLARE @ErrorMsg VARCHAR(50)
EXEC tsqlt.FakeTable @TableName = 'MyTable'
EXEC tsqlt.ApplyTrigger 'MyTable', 'MyTable_IUDTR'
BEGIN TRY
INSERT INTO dbo.MyTable
( FirstName, LastName )
VALUES ( N'John',N'Smith')
END TRY
BEGIN CATCH
SET @ErrorMsg = ERROR_MESSAGE()
END CATCH
EXEC tSQLt.AssertEqualsString @Expected = 'MyError', @Actual = @ErrorMsg
END
GO
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
649 次 |
| 最近记录: |