我一直在尽我所能去遵循http://www.sommarskog.se/share_data.html和tSQLt文档中的知识;试图让我的存储过程保持轻松和相对不复杂,以便它们易于测试。所以,我发现自己在主存储过程中创建临时表,然后在从主存储过程调用的“辅助”存储过程中对该临时表进行操作。这个工作非常好,但是测试有点尴尬。测试在调用者临时表上运行的存储过程
当单独测试“辅助”存储过程时,临时表必须已经存在。它看起来像在[Set Up]
过程中创建临时表不会持续到单元测试,但创建一个完整的表。
因此,为了避免在每一个单元测试重复CREATE TABLE #temp
(连同其全列定义),我做了以下的变化:
EXEC tSQLt.NewTestClass 'SEtest';
GO
CREATE PROCEDURE [SEtest].[SetUp]
AS
BEGIN
CREATE TABLE SEtest.temptemplate (col1 int);
END;
GO
CREATE PROCEDURE [SEtest].[test example]
AS
BEGIN
-- Assemble
SELECT TOP (0) * INTO #temp FROM SEtest.temptemplate;
INSERT INTO #temp (col1)
VALUES (1),(2),(5),(7);
-- Act
EXEC dbo.REMOVE_EVEN_NUMBERS;
-- Assert
SELECT TOP (0) * INTO #expected FROM #temp;
INSERT INTO #expected (col1)
VALUES (1),(5),(7);
EXEC tSQLt.AssertEqualsTable '#expected', '#temp';
END;
GO
是否有更好的方式与共享调和tSQLt存储过程之间的数据通过临时表?
“我发现自己在主存储过程中创建临时表,然后在从主存储过程调用的”辅助“存储过程中在该临时表上进行操作” - 我尽可能避免使用该模式。一旦存储过程执行“泄漏”,维护和测试就变得更加困难。一个内联表值函数通常可以解决方案 –
米奇,我不得不不同意。在这种情况下,#temp表的定义是sproc和调用者之间合同的一部分。因此,如果你有适当的测试,它不会使程序难以维护。不过,我同意,它有点难看(但有时候T-SQL很丑)。 –
我能想出的唯一可能是一个改进将是一个过程键,永久表。只要我不介意不驻留在tempdb中的轻微性能问题,并且在数据库中有一个额外的对象,我可能就像往常一样在测试中伪造FakeTable。 – NReilingh