tSQLt применяет ограничение NOT NULL - PullRequest
0 голосов
/ 19 марта 2019

Как применить ограничение NOT NULL обратно к столбцу таблицы в tSQLt?

CREATE OR ALTER PROCEDURE [test abc].[test abc1]
AS
BEGIN
    -- Arrange
    EXEC tSQLt.FakeTable 'dbo', 'table1';
    -- Here the NOT NULL constraint should be put back on table1 column col1
    EXEC [tSQLt].[ExpectNoException]
    -- Act + Assert
    INSERT INTO .....
END
GO

Ответы [ 2 ]

1 голос
/ 20 марта 2019

ОП конкретно спрашивает, как это сделать в контексте модульного теста tSQLt.

Для тех, кто не знает, tSQLt.FakeTable временно заменяет реальную таблицу на макет с таким жеимена схем, таблиц и столбцов плюс все те же типы данных, но без ограничений.Таким образом, все столбцы допускают NULL, и все ключи, значения по умолчанию, ограничения проверки и даже свойство IDENTITY удаляются на время теста.Это может быть полезно при написании модульных тестов для одной таблицы, которая имеет много зависимостей - это минимизирует настройки, необходимые для каждого теста.В конце каждого теста транзакция, в которой был выполнен этот тест, откатывается и возвращается исходная структура таблицы.

Теперь вернемся к актуальному вопросу, в то время как таблица tSQLt.Fake допускает определенные функции исходногоТаблица, которая будет сохранена в макете, включая автоинкремент, вычисляемые столбцы и ограничения по умолчанию, обнуляемость не является одной из этих функций.Хотя если @SebastianMeine или @dennislloydjr читает это, такая функция может оказаться полезной.

Я не верю, что не существует автоматического способа применить NOT NULL к столбцам в фальшивой таблице, однакоэто поднимает вопрос о вашем случае использования.Хотя FakeTable невероятно полезен во многих тестовых сценариях, есть случаи, когда вы хотите запустить один или несколько тестов для реальной таблицы.Очевидным примером здесь является хранимая процедура, предназначенная для вставки новой строки в эту таблицу.Если новый столбец NOT NULL добавляется в таблицу после записи sproc вставки, процедура завершится ошибкой, поскольку она не вставляет значение в новый обязательный столбец.Вы определенно захотите проверить это при тестировании и проведении хотя бы одного теста этой хранимой процедуры с реальной таблицей, которая обнаружит эту ошибку до того, как вы приступите к работе.

Если ваш сценарий использования требует, чтобы только определенныйЕсли для столбца задано значение NOT NULL, то вы можете сделать это вручную UPDATE myTable ALTER COLUMN myColumn <datatype> NOT NULL после вызова tSQLt.FakeTable, хотя опасность такого подхода заключается в том, что если в будущем тип данных или обнуляемость этого столбца изменятся, у вас не будет способа автоматически изменитьопределение столбца в вашем тесте - что делает его менее надежным.

Извините, на ваш вопрос нет простого ответа.

1 голос
/ 19 марта 2019

Попробуйте следующее:

UPDATE MYTABLE
SET MyColumn = 'Default Value'
WHERE MyColumn IS NULL

ALTER TABLE MYTABLE
AlTER COLUMN MyColumn DATATYPE NOT NULL
...