我一直在盡我所能去遵循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