tSQLt – izolacja funkcji

Izolacja funkcji w tSQLt niestety wygląda trochę inaczej niż miało miejsce to w przypadku izolacji procedur. Do dyspozycji mamy następującą funkcję:

tSQLt.FakeFunction [@FunctionName = ] 'function name'
                 , [@FakeFunctionName = ] 'fake function name'

Jak widzimy z sygnatury, musimy dostarczyć nazwę funkcji, która ma wykonać się zamiast oryginalnego kodu. Załóżmy, że chcemy stworzyć stub GetDate, który zwraca zawsze stałą wartość. Niestety, GetDate jest funkcją systemową i takich nie można bezpośrednio modyfikować. Stwórzmy zatem wrapper:

CREATE FUNCTION GetDateWrapper
(
)
RETURNS DATETIME
AS
BEGIN
	RETURN GETDATE()

END

Następnie nasz stub będzie zwracał zawsze stałą datę:

CREATE FUNCTION sampleTests.GetDateFake
(
)
RETURNS DATETIME
AS
BEGIN
	RETURN DATETIMEFROMPARTS(2015,1,1,12,10,14,4)

END

GetDateFake zwraca 2015-01-01. Przykładowy test może wyglądać następująco:

EXEC tsqlt.FakeFunction @FunctionName = N'dbo.GetDateWrapper', -- nvarchar(max)
    @FakeFunctionName = N'sampleTests.GetDateFake' -- nvarchar(max)

SELECT dbo.GetDateWrapper();

W przypadku GetDate nie jest to najlepsza praktyka. W zależności od scenariusza, lepszym rozwiązaniem może okazać się przekazywanie czasu jako parametr wejściowy. FakeFunction zdecydowanie jest praktyczny, gdy w kodzie wywołujemy skomplikowane funkcje i nie chcemy ich akurat weryfikować w danym teście.

Leave a Reply

Your email address will not be published.