GETUTCDATE() 関数を数回使用するストアド プロシージャがあります。これは非常に特殊な事業部門の sproc であるため、ここで表示することはあまり意味がありません。そうは言っても、sproc が呼び出されるのはその年だけであることを知っておくと役立つかもしれません。これは、私がやっていることの複雑さを示すものではありませんが、私が話していることを説明するのに役立つはずの不自然な例です:
CREATE PROCEDURE dbo.GenerateRequestListForCurrentYear AS BEGIN
SELECT RequestId, StartDate, EndDate FROM Requests
WHERE YEAR(EndDate) = YEAR(GETUTCDATE());
END;
私のテストは次のようになります。
CREATE PROCEDURE testClass.[test Requests are generated for the current year] AS BEGIN
-- arrange
EXEC tSQLt.FakeTable 'dbo.Requests';
INSERT INTO dbo.Requests (RequestId, StartDate, EndDate) VALUES
(1, '2/1/14', '2/10/14'), (2, '2/1/13', '2/10/13');
SELECT TOP (0) * INTO #Expected FROM dbo.Requests;
SELECT TOP (0) * INTO #Actual FROM dbo.Requests;
INSERT INTO #Expected VALUES
(1, '2/1/14', '2/10/14');
-- act
INSERT INTO #Actual
EXEC dbo.GenerateRequestListForCurrentYear;
-- assert
EXEC tSQLt.AssertEqualsTable #Expected, #Actual;
END;
いくつかのオプションがあります。
- 日付/時刻をパラメーターとして渡します (NULL の場合は値を GETUTCDATE() に設定します)。
- GETUTCDATE() への呼び出しを独自の関数に置き換えて、tSQLt を使用して偽造できる日付/時刻を返します
- ?
これらはどちらも、少し臭いと思われるテストにのみ必要なオプションのようです。プライマリ アプリケーションからの呼び出し方法に関して、この sproc をパラメーター化する必要はありません。
独自の依存関係を持つ SQL の組み込み関数との依存関係に関連するため、tSQLt テストでそれらの呼び出しを偽造する方法はありますか? tSQLt を使用してテストで指定した日付を返すために GETUTCDATE() への呼び出しを偽造するより良い方法はありますか、それともこれらが私の唯一のオプションですか?