【发布时间】:2017-08-04 08:59:16
【问题描述】:
目前我正在尝试测试具有唯一过滤索引的表。到目前为止,我发现的唯一建议是使用 CONSTRAINT 而不是索引,因为 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;
【问题讨论】:
-
那么你的问题是什么?唯一约束总是在幕后创建唯一索引,因此如果您直接创建它,它将完成它的工作。
-
那么如何使唯一约束被过滤?
-
你不明白我的意思。我说,直接创建唯一索引
-
您的代码已经创建了它。唯一奇怪的是您的键列与您过滤的内容相同。哪个字段应该是唯一的?
-
您为什么要测试唯一索引在重复项上引发异常的功能?您不应该测试产品功能是否有效。
标签: sql-server unit-testing tsqlt