Протестируйте уникальный отфильтрованный индекс с помощью tSQLt
В настоящее время я пытаюсь проверить таблицу с уникальным отфильтрованным индексом. Единственные предложения, которые я нашел, - это использовать CONSTRAINT вместо index как tSQLt
имеет ApplyConstraint
SP. Однако я все равно не мог найти, как сделать фильтрованное ограничение... Есть предложения?
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;
1 ответ
Решение
В основном вы тестируете, что нет никаких непреднамеренных изменений схемы, которые сломали (удалили / отключили / изменили предикат) ваш уникальный фильтрованный индекс.
Если вы фальсифицируете таблицу, то вам нужно добавить уникальный отфильтрованный индекс в фальшивку самостоятельно, что сводит на нет смысл.
Это должно работать.
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