Testen Sie den einzigartigen gefilterten Index mit tSQLt

Momentan versuche ich, die Tabelle zu testing, die einen eindeutigen gefilterten Index hat. Die einzigen Vorschläge, die ich bisher gefunden habe, ist, CONSTRAINT anstelle von index zu verwenden, da tSQLt ApplyConstraint SP hat. Allerdings konnte ich sowieso nicht finden, wie man gefilterte Einschränkungen macht … Irgendwelche Vorschläge?

 CREATE TABLE [dbo].[prime_rates] ( [prime_rate] DECIMAL(5, 3) NOT NULL , [start_date] DATE NOT NULL , [end_date] DATE NOT NULL DEFAULT '12/31/2099' ); GO CREATE UNIQUE INDEX [UIX_prime_rates_end_date] ON [dbo].[prime_rates] ([end_date]) WHERE [end_date] = '12/31/2099'; GO CREATE PROCEDURE [Test Class1].[test when 2 active prime rates are inserted then raise error] AS BEGIN EXEC tSQLt.FakeTable @TableName = N'prime_rates'; EXEC tSQLt.ApplyConstraint 'dbo.prime_rates', 'UIX_prime_rates_end_date'; INSERT INTO dbo.prime_rates ( prime_rate , start_date , end_date ) VALUES ( 1 -- prime_rate - decimal(5, 3) , GETDATE() -- start_date - date , '2099-12-31' -- end_date - date ); EXEC tSQLt.ExpectException @ExpectedSeverity = 16; INSERT INTO dbo.prime_rates ( prime_rate , start_date , end_date ) VALUES ( 1 -- prime_rate - decimal(5, 3) , GETDATE() -- start_date - date , '2099-12-31' -- end_date - date ); END; 

Grundsätzlich testing Sie, dass es keine unbeabsichtigten Schema Änderungen gibt, die gebrochen haben (entfernt / deaktiviert / geändert das Prädikat) Ihren einzigartigen gefilterten Index.

Wenn du den Tisch gefälscht hast, dann musst du den einzigartigen gefilterten Index dem Fake selbst hinzufügen, der den Punkt negiert.

Das sollte funktionieren

 CREATE PROCEDURE [Test Class1].[test when 2 active prime rates are inserted then raise error] AS BEGIN IF @@TRANCOUNT = 0 THROW 50000, 'This must be run in a transaction and rolled back afterwards. Use "EXEC tSQLt.RunAll;" etc. Don''t run directly ', 1; TRUNCATE TABLE dbo.prime_rates; INSERT INTO dbo.prime_rates (prime_rate, start_date, end_date) VALUES ( 1 -- prime_rate - decimal(5, 3) ,GETDATE() -- start_date - date ,'2099-12-31' -- end_date - date ); EXEC tSQLt.ExpectException @ExpectedSeverity = 16; INSERT INTO dbo.prime_rates (prime_rate, start_date, end_date) VALUES ( 1 -- prime_rate - decimal(5, 3) ,GETDATE() -- start_date - date ,'2099-12-31' -- end_date - date ); END