使用 tSQLt 测试唯一过滤索引

Test unique filtered index with tSQLt

目前我正在尝试测试具有唯一过滤索引的 table。到目前为止我发现的唯一建议是使用 CONSTRAINT 而不是索引,因为 tSQLtApplyConstraint 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;

基本上,您是在测试没有无意的架构更改破坏了(removed/disabled/changed 谓词)您的唯一过滤索引。

如果您伪造了 table,则您需要自己将唯一过滤索引添加到伪造品中,这否定了这一点。

这应该有效。

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