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目前只限于在自己的事务中运行测试,而且正如您所看到的,当您处理它的事务时,它的反应是不受欢迎的 因此,要使此测试正常工作,您需要跳过测试内部的回滚,而不是外部的回滚 我建议采取这种做法: