Triggers tSQLt、触发器和测试

Triggers tSQLt、触发器和测试,triggers,transactions,tsqlt,raiserror,Triggers,Transactions,Tsqlt,Raiserror,我试着把我的大脑围绕在这个问题上,但无法让它工作,所以我在这里介绍了一个小测试用例,希望有人能向我解释: 首先是一个小测试数据库: CREATE DATABASE test; USE test; CREATE TABLE testA (nr INT) GO CREATE TRIGGER triggerTestA ON testA FOR INSERT AS BEGIN SET NOCOUNT ON; IF EXISTS (SELECT nr FROM Inserted WHERE nr

我试着把我的大脑围绕在这个问题上,但无法让它工作,所以我在这里介绍了一个小测试用例,希望有人能向我解释:

首先是一个小测试数据库:

CREATE DATABASE test;
USE test;
CREATE TABLE testA (nr INT)
GO

CREATE TRIGGER triggerTestA
ON testA
FOR INSERT AS BEGIN
  SET NOCOUNT ON;
  IF EXISTS (SELECT nr FROM Inserted WHERE nr > 10)
    RAISERROR('Too high number!', 16, 1);
END;
下面是一个tSQL测试,用于测试行为:

ALTER PROCEDURE [mytests].[test1] AS
BEGIN
  EXEC tSQLt.FakeTable @TableName = N'testA'
  EXEC tSQLt.ApplyTrigger  
    @TableName = N'testA', 
    @TriggerName ='triggerTestA'
  EXEC tSQLt.ExpectException
  INSERT INTO dbo.testA VALUES (12)
END;
此测试运行正常-但触发器没有执行我想要的操作:阻止用户输入大于10的值。此版本的触发器符合我的要求:

CREATE TRIGGER triggerTestA
ON testA FOR INSERT AS BEGIN
  SET NOCOUNT ON;
  BEGIN TRANSACTION;
  BEGIN TRY
    IF EXISTS (SELECT nr FROM Inserted WHERE nr > 10)
      RAISERROR('Too high number!', 16, 1);
    COMMIT TRANSACTION;
  END TRY
  BEGIN CATCH
    ROLLBACK TRANSACTION;
    THROW;
  END CATCH;
END;
但是现在测试失败了,说明A)有一个错误(这是预期的!)和B)没有与回滚事务匹配的BEGIN事务。我猜这最后一个错误是与tSQLt相关的事务,我的触发器以某种方式干扰了它,但它肯定不是我所期望的


有人能解释一下,也许能帮我把它做好吗?

tSQLt目前只限于在自己的事务中运行测试,而且正如您所看到的,当您处理它的事务时,它的反应是不受欢迎的

因此,要使此测试正常工作,您需要跳过测试内部的回滚,而不是外部的回滚

我建议采取这种做法:

  • 从触发器中删除所有事务处理语句。无论如何,您都不需要开始事务,因为触发器总是在事务内部执行
  • 如果发现违反规则的行,请调用执行回滚和出错的过程
  • 检查你的测试程序
  • 要测试该过程本身,可以使用tSQLt.NewConnection