tSQLt faketable不重置表映射时如何恢复?

问题描述 投票:11回答:4

仿表功能未重新分配为正常。现在,我使用过法制表的所有表都包含我在单元测试插入中使用的值的内容。它有很多表,这使我的数据库无用。请帮助解决此问题或至少是其原因。这使我非常担心在CI部署过程中使用它,也许在我们本地的开发工作中更重要。

sql-server tdd tsqlt
4个回答
5
投票

您的测试或代码中的一个可能使事务处于无法回滚的状态。这通常会导致在结果中看到一个或多个测试带有“错误”(而不是“成功”或“失败”)。

在这些情况下,不会回滚FakeTable操作,并且表将保持其伪造状态。

在幕后,FakeTable重命名该表并创建它的新副本。重命名发生时,该操作将记录在tSQLt.Private_RenamedObjectLog中。

例如,您可以使用以下代码来重现tSQLt无法正常回滚的错误:

EXEC tSQLt.NewTestClass 'SOF_Example'
GO

CREATE TABLE SOF_Example.MyTable (i INT);
GO

INSERT INTO SOF_Example.MyTable (i) VALUES (5);
GO

CREATE PROCEDURE SOF_Example.[test fake a table]
AS
BEGIN
    EXEC tSQLt.FakeTable 'SOF_Example.MyTable';

    INSERT INTO SOF_Example.MyTable (i) VALUES (12);

    COMMIT;
END;
GO

EXEC tSQLt.Run 'SOF_Example';

您可以使用此代码查看重命名的表日志:

SELECT OriginalName, SCHEMA_NAME(schema_id) + '.' + name AS [Name of Renamed Table], create_date
FROM tSQLt.Private_RenamedObjectLog
JOIN sys.objects ON ObjectId = object_id;

如果您多次重新执行测试,则每个伪造表的日志中可能会有很多条目。您可以使用create_date来帮助确定哪个包含原始数据。

现在,话虽如此,最好不要在必须保留数据的数据库中编写和执行测试用例。最好的方法是使用不包含用户数据(最多仅包含基本配置数据)的数据库。您应该从空白数据库进行开发和单元测试。填充的数据库应用于其他形式的测试,例如集成,可用性,性能等。


5
投票

[这只能处理将表放回原处(因为这是我和OP都存在的问题),但是胡乱丢掉表的那一行可能会使它与其他对象类型一起使用。


3
投票

我在使用tSQLt时遇到了同样的问题,并且能够使用表tSQLt.Private_RenamedObjectLog的内容还原所有内容


0
投票

我知道我已经回答了两次这个问题!希望这个答案更有用。另外,这个问题是古老的!没有人用SpyProcedure处理假冒程序。

© www.soinside.com 2019 - 2024. All rights reserved.