【问题标题】:Test unique filtered index with tSQLt使用 tSQLt 测试唯一过滤索引
【发布时间】:2017-08-04 08:59:16
【问题描述】:

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

【问题讨论】:

  • 那么你的问题是什么?唯一约束总是在幕后创建唯一索引,因此如果您直接创建它,它将完成它的工作。
  • 那么如何使唯一约束被过滤?
  • 你不明白我的意思。我说,直接创建唯一索引
  • 您的代码已经创建了它。唯一奇怪的是您的键列与您过滤的内容相同。哪个字段应该是唯一的?
  • 您为什么要测试唯一索引在重复项上引发异常的功能?您不应该测试产品功能是否有效。

标签: sql-server unit-testing tsqlt


【解决方案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 

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多