Triggers 可使用tSQLt移除触发器

Triggers 可使用tSQLt移除触发器,triggers,tsqlt,Triggers,Tsqlt,我已经让jsut开始使用tSQLt,并准备测试触发器。我调用FakeTable过程并进行测试,但触发器未执行。如果不使用FakeTable,则执行触发器。这似乎真的很糟糕,我找不到任何信息表明有任何方法可以读取它们 然后我认为FakeTable删除了触发器,但我可以在调用后重新创建它们,并在测试中执行了以下代码: DECLARE @createTrigger NVARCHAR(MAX); SELECT @createTrigger = OBJECT_DEFINITION(OBJECT_ID('M

我已经让jsut开始使用tSQLt,并准备测试触发器。我调用FakeTable过程并进行测试,但触发器未执行。如果不使用FakeTable,则执行触发器。这似乎真的很糟糕,我找不到任何信息表明有任何方法可以读取它们

然后我认为FakeTable删除了触发器,但我可以在调用后重新创建它们,并在测试中执行了以下代码:

DECLARE @createTrigger NVARCHAR(MAX);
SELECT @createTrigger = OBJECT_DEFINITION(OBJECT_ID('MoveDataFromAToB'))    
EXEC tSQLt.FakeTable 'dbo.A';
EXEC(@createTrigger);
我收到以下错误:“数据库中已经有一个名为‘MoveDataFromAToB’的对象。{MoveDataFromAToB,14}(还有一个回滚错误-->当前事务无法提交并且无法回滚到保存点。回滚整个事务。{Private_RunTest,60})”


有没有人有过tSQLt方面的经验,并且知道这个问题的解决方法?

tSQLt待办事项中有一个ApplyTrigger方法,但它还没有完成。现在,您应该能够在测试中使用以下代码:

DECLARE @createTrigger NVARCHAR(MAX);
SELECT @createTrigger = OBJECT_DEFINITION(OBJECT_ID('MoveDataFromAToB'));
DROP TRIGGER MoveDataFromAToB;    
EXEC tSQLt.FakeTable 'dbo.A';
EXEC(@createTrigger);
您需要删除现有触发器,因为FakeTable不会删除原始表。它只是将其重命名,使旧触发器保持不变;因此,您确实看到了碰撞的名称

tSQLt在每个测试结束时执行的回滚将使丢弃的触发器重新就位(除非您在代码中做了一些非常糟糕的事情)。如果您担心这一点,请使用sp_重命名,而不是使用触发器


我将把所有这些放在测试类中的一个helper存储过程中,并从需要它的测试中调用它。这样,一旦我们在tSQLt中实现了更好的解决方案,您只需更改代码中的一个位置。

感谢Sebastian的回答。这对我也很有帮助:) 我为你提供的代码做了一个存储过程。在“ApplyTrigger”功能可用之前,我将使用此选项:

CREATE PROCEDURE [tSQLt].[FakeTableWithTrigger]
    @TableName NVARCHAR(MAX),
    @TriggerName NVARCHAR(MAX),
    @SchemaName NVARCHAR(MAX) = NULL, --parameter preserved for backward compatibility. Do not use. Will be removed soon.
    @Identity BIT = NULL,
    @ComputedColumns BIT = NULL,
    @Defaults BIT = NULL
AS
BEGIN
   DECLARE @createTrigger NVARCHAR(MAX);
    SELECT @createTrigger = OBJECT_DEFINITION(OBJECT_ID(@TriggerName));
    EXEC('DROP TRIGGER ' + @TriggerName);    
    EXEC tSQLt.FakeTable @TableName, @SchemaName, @Identity, @ComputedColumns, @Defaults;
    EXEC(@createTrigger);   
END
它在测试中的使用示例如下:

exec tSQLt.FakeTableWithTrigger 'dbo.MyTable', 'MyTable_SyncTrigger', @Identity = 1

哦,这似乎是一个很好的解决方案。我觉得自己有点傻,没想到这一点。很高兴听到ApplyTriggers即将推出:)谢谢您的帮助:)