2012-11-25 15 views
0

我有jsut开始使用tSQLt并正在测试触发器。我打电话给FakeTable程序并做我的测试,但触发器没有执行。如果不使用FakeTable,则执行触发器。这似乎是非常糟糕的,我不能找到任何信息,有任何方法来阅读它们。带有tSQLt的伪造表格删除触发器

所以,我觉得触发由FakeTable删除,但通话结束后,我可以重新创建它们并没有在我的测试下面的代码:

DECLARE @createTrigger NVARCHAR(MAX); 
SELECT @createTrigger = OBJECT_DEFINITION(OBJECT_ID('MoveDataFromAToB'))  
EXEC tSQLt.FakeTable 'dbo.A'; 
EXEC(@createTrigger); 

我得到了以下错误:“已经有一个名为对象'MoveDataFromAToB'{MoveDataFromAToB,14}(还有一个ROLLBACK ERROR - >当前事务不能被提交并且不能被回滚到一个保存点,回滚整个事务{Private_RunTest,60})“

任何有tSQLt经验的人都知道这个问题的任何解决方法吗?

回答

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,而不是在触发器上放置。

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

+0

哦,这似乎是一个很好的解决方案。感觉有点愚蠢,我没有想到这一点。 很高兴听到ApplyTriggers在路上:) 感谢您的帮助:) – user1454695

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