O tSQLt pisałem już wiele razy. Dzisiaj chciałbym pokazać jak testować wyzwalacze (triggers). Załóżmy, że mamy następującą tabelę:
CREATE TABLE [dbo].[Articles]( [Id] [int] IDENTITY(1,1) NOT NULL, [Price] [int] NULL, CONSTRAINT [PK_Articles] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
Jest to prosta tabela z kluczem głównym oraz jedną kolumną (cena). Napiszmy wyzwalacz, w którym za każdym razem, gdy dodajemy nowy wiersz, cena jest podwajana i kolejny wiersz jest dodawany:
CREATE TRIGGER [dbo].[OnArticleInserted] ON [dbo].[Articles] AFTER INSERT AS INSERT INTO Articles (Price) (SELECT Price*2 from inserted)
Nasz test z kolei będzie wyglądać następująco:
ALTER PROCEDURE [sampleTests].[testTrigger] AS BEGIN --Assemble exec tSQLt.FakeTable 'Articles' exec tSQLt.ApplyTrigger 'Articles', 'OnArticleInserted' create table ExpectedValues ( Price integer ) INSERT INTO ExpectedValues (Price) Values (6),(12) --Act INSERT INTO Articles (Price) Values (6) --Assert EXEC tSQLt.AssertEqualsTable @Expected = N'ExpectedValues', @Actual = N'Articles' END
Zawsze chcemy odizolowywać tabele. Z tego względu używamy FakeTable na “Articles”. W naszym przypadku, wyzwalacz operuje tylko na tej tabeli więc to wystarczy. W praktyce izolujemy wszystkie tabele z danego wyzwalacza.
Następnie wywołujemy ApplyTrigger. Wiemy, że FakeTable powoduje stworzenie mock’a, zatem wszystkie wyzwalacze domyślnie będą odizolowane. Wywołanie ApplyTrigger umożliwia selektywną aktywację wyzwalaczy.
Dalsza część kodu już wygląda analogicznie do innych testów. Wykonujemy INSERT INTO na Article, co spowoduje uruchomienie naszego wyzwalacza. Na końcu sprawdzamy, czy nowy wiersz faktycznie został dodany.