0

我已经开始使用 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 有任何经验并知道此问题的任何解决方法的人吗?

4

2 回答 2

2

tSQLt backlog 上有一个 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_rename 而不是 drop 触发器。

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

于 2012-11-25T23:03:01.167 回答
0

感谢塞巴斯蒂安的回答。它也对我很有帮助:) 我为您提供的代码制作了一个存储过程。在“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
于 2012-11-27T08:46:41.990 回答