2

每当我使用 ExpectException 时,我都会收到以下错误:(还有一个 ROLLBACK ERROR --> 当前事务无法提交,也无法回滚到保存点。回滚整个事务。{Private_RunTest,140})

在 MSSQL 由于 RAISERROR 已经执行 ROLLBACK 之后,tSQLt 似乎正在尝试 ROLLBACK。我用下面的 IF 语句将下面的 SELECT 和 SET 语句包装在 Private_RunTest 中,它似乎解决了这个问题。

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

这真的是一个错误和/或适当的修复吗?

4

2 回答 2

5

您可能没有在 tsqlt 测试中使用 TRY/CATCH 块。

错误信息“ There was also a ROLLBACK ERROR --> The current transaction cannot becommited and cannot be roll back to a savepoint. Roll back the entire transaction. ”可以重现如下:

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

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

3)运行测试:

EXEC [tSQLt].Run 'ut_MyTable_IUDTR.test that the error is returned'

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.

修复:

更改 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
于 2016-06-03T01:11:43.437 回答
0

您可能SET XACT_ABORT ON在 tsqlt 测试中使用

CREATE PROC [testClass].[test foo]
作为
开始
  设置 XACT_ABORT 开
  执行 tsqlt.AssertEquals @Expected = 1,@Actual = 0
结尾

不要这样做。

你会收到这样的消息

[testClass].[test foo] failed: (Error) Expected: <1> but was: <0> (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.{Private_RunTest,160})

于 2016-11-22T00:19:50.377 回答