tSQLt не будет применять ограничения с неназванными именами (PK_dbo ....) к поддельной таблице - PullRequest
0 голосов
/ 06 сентября 2018

Добавление тестов tSQLt к существующему производственному продукту, поэтому мы не можем изменять таблицы, ограничения и т. Д. В настоящее время все ограничения помечены как «PK_dbo.ViolationCategory», когда они должны быть похожи на «PK_ViolationCategory»

Когда я бегу:

    EXEC tSQLt.NewTestClass 'AdHocReportFiltersTestConstraint';
    GO

    CREATE PROCEDURE [AdHocReportFiltersTestConstraint].[Setup]
    AS
    BEGIN
        EXEC tSQLt.FakeTable 'dbo.AdHocReports'
    END
    GO


    CREATE PROCEDURE [AdHocReportFiltersTestConstraint].[test_AdHocReportFilters_Constraint]
    AS
    BEGIN
        DECLARE @Id uniqueidentifier = NEWID()  
        DECLARE @Name NVARCHAR(Max) = 'Test_Name'
        DECLARE @Value NVARCHAR(Max) = 'Test_Value'
        DECLARE @AdHocReport_ID uniqueidentifier = NEWID()  

        INSERT INTO dbo.AdHocReportFilters ([Id], [Name], [Value], [AdHocReport_Id])
            VALUES (@Id, @Name, @Value, @AdHocReport_ID)

            exec tSQLt.ApplyConstraint 'dbo.AdHocReports', 'PK_dbo.AdHocReportFilters';

    END


    EXEC tSQLt.RunTestClass 'AdHocReportFiltersTestConstraint';
    GO

получаю ошибку,

(1 row affected)
[AdHocReportFiltersTestConstraint].[test_AdHocReportFilters_Constraint] failed: 
(Error) The INSERT statement conflicted with the FOREIGN KEY constraint 
"FK_dbo.AdHocReportFilters_dbo.AdHocReports_AdHocReport_Id". The conflict occurred in 
database "CR", table "dbo.tSQLt_tempobject_fbc9c8bf09e742929eccae914d5e440d", 
column 'Id'.[16,0]{test_AdHocReportFilters_Constraint,11}

Есть идеи, как обойти это?

Как только я получу эту работу, я добавлю вторую запись, чтобы нарушить ограничение PK и поймать ошибку.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Есть две таблицы:

dbo.AdHocReports (Id,... (more columns))
dbo.AdHocReportFilters ([Id], [Name], [Value], [AdHocReport_Id] ) 

AdHocReportFilters.AdHocReport_Id является внешним ключом для таблицы dbo.AdHocReportFilters, ссылающейся на dbo.AdHocReports.Id

При вставке вставить строку в таблицу AdHocReportFilters, вы должны убедиться, что AdHocReportFilters.AdHocReport_Id является id column в таблице dbo.AdHocReports

Но в вашем SP @AdHocReport_ID равно NEWID(), что, конечно, является уникальным значением и, следовательно, отсутствует в таблице dbo.AdHocReports.Id

Работа вокруг,

Отключить ограничение внешнего ключа

ALTER TABLE dbo.AdHocReportFilters NOCHECK CONSTRAINT FK_dbo.AdHocReportFilters_dbo.AdHocReports_AdHocReport_Id
0 голосов
/ 07 сентября 2018

Просто глядя на ваш код, я вижу, что вы делаете следующее:

  1. Подделка таблицы dbo. AdHocReports
  2. Вставьте строку в таблицуdbo. AdHocReportFilters
  3. Примените ограничение PK с именем "PK_dbo.AdHocReportFilters" к таблице dbo. AdHocReports
  4. Затем попытайтесь добавить еще однострока для проверки ограничения PK_dbo.AdHocReportFilters

Появляющаяся ошибка, по-видимому, указывает на то, что вы нарушаете внешний ключ в таблице AdHocReportFilters - что ожидается после этой таблицыне был подделан.

Из названия теста не ясно, пытаетесь ли вы проверить поведение первичного или внешнего ключа.

Глядя на шаги, я думаю, что выможет смешивать две таблицы, но без более подробных операторов кода (например, CREATE TABLE) мне трудно помочь вам в дальнейшем.

...