1

目前我正在尝试测试具有唯一过滤索引的表。到目前为止,我发现的唯一建议是使用 CONSTRAINT 而不是像SPtSQLt那样使用索引。ApplyConstraint但是我无论如何都找不到如何进行过滤约束...有什么建议吗?

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;
4

1 回答 1

2

基本上,您正在测试没有无意的架构更改破坏(删除/禁用/更改谓词)您的唯一过滤索引。

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

这应该有效。

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 
于 2017-08-04T10:12:29.643 回答