tSQLt – izolacja procedur

W ostatnich wpisach pokazałem jak izolować dane w formie tabel. W skomplikowanych przypadkach jednak, chcemy również izolacji procedur. Klasyczny przykład to operacje bazujące na czasie lub losowych wartościach. Załóżmy, że mamy następującą procedurę:

CREATE PROCEDURE GetCurrentDate
@outputDate DATETIME output
AS
BEGIN
	SELECT @outputDate=GETDATE();
END

Następnie chcemy przetestować procedurę, która korzysta z powyższej metody. Oczywiście będzie to bardzo trudne, ponieważ wynik prawdopodobnie zależy od aktualnego czasu. Nie trudno wyobrazić sobie zapytanie typu:

SELECT * FROM Table where EndDate > GetDate();

Wynika z tego, że musimy odizolować GetCurrentDate i wstrzyknąć zawartość, którą możemy kontrolować. Izolacja procedur odbywa się za pomocą metody SpyProcedure:

EXEC tSQLt.SpyProcedure 'dbo.GetCurrentDate', 'SET @outputDate = DATEFROMPARTS(2015,01,5)';

Od tego momentu, jakiekolwiek wywołanie GetCurrentDate, wykona kod przekazany jako drugi parametr. W powyższym przypadku, GetCurrentDate zawsze zwraca 2015-01-05. Całość można przetestować wykonując następujący kod:

DECLARE @date datetime;

EXEC tSQLt.SpyProcedure 'dbo.GetCurrentDate', 'SET @outputDate = DATEFROMPARTS(2015,01,5)';

EXEC dbo.GetCurrentDate @date OUTPUT;

SELECT @date;

Niestety, możliwości są dużo mniejsze niż te co mamy w przypadku C#+moq. Język TSQL jest jednak dość prosty. Moim zdaniem jest to wystarczające, szczególnie, że procedury T-SQL są dużo prostsze niż logika zaimplementowana w kodzie Java\C#.

Leave a Reply

Your email address will not be published.