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

Добавление тестов 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 и поймать ошибку.


person Richard    schedule 06.09.2018    source источник
comment
Что вы пытаетесь достичь?   -  person www.StudioSQL.nl    schedule 06.09.2018
comment
Извиняюсь. Добавлено уточнение. ... Как только я заработаю, я добавлю вторую запись, чтобы нарушить ограничение PK и поймать ошибку   -  person Richard    schedule 06.09.2018


Ответы (2)


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

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

Ошибка, которую вы получаете, предполагает, что вы нарушаете внешний ключ в таблице AdHocReportFilters, что ожидается, поскольку эта таблица не была подделана.

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

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

person datacentricity    schedule 07.09.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
person Prahalad Gaggar    schedule 07.09.2018