Необходимо объявить скалярную переменную в модульном тесте - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь разработать модульный тест, который гарантирует, что сообщение будет больше определенного количества символов. Мой код:

EXEC tSQLt.NewTestClass 'TestMarketingEnoughRows';
GO
CREATE OR ALTER PROCEDURE TestMarketing.[test that API_GetStandardDisclaimerText tests to make sure that the message is long enough]
AS
BEGIN
    DROP TABLE IF EXISTS #Actual;
    CREATE TABLE #Actual
    (
        Note NVARCHAR(MAX),
        NoteWithHTML XML
    );
    INSERT #Actual
    (
        Note,
        NoteWithHTML
    )
    EXEC Marketing.API_GetStandardDisclaimerText @Username = 'AnyValue',  -- varchar(100)
                                                 @OneParagraphPerRow = 0; -- bit

    SELECT LEN(Note),
           LEN(CAST(NoteWithHTML AS NVARCHAR(MAX)))
    FROM #Actual;
    DECLARE @ArbitaryNumberOfCharacters INT = 15000;
    DECLARE @ThisShouldEqualOne BIT =
            (
                SELECT CASE
                           WHEN LEN(Note) > @ArbitraryNumberOfCharacters
                                AND LEN(CAST(NoteWithHTML AS NVARCHAR(MAX))) > @ArbitraryNumberOfCharacters THEN
                               1
                           ELSE
                               0
                       END
                FROM #Actual
            );
    EXEC tSQLt.AssertEquals @Expected = @ThisShouldEqualOne,       -- sql_variant
                               @Actual = @ArbitaryNumberOfCharacters, -- sql_variant
                               @Message = N'test mctestyface';   -- nvarchar(max)



END;
GO
EXEC tSQLt.Run 'TestMarketingEnoughRows';

Я получаю следующие ошибки:

Сообщение 137, Уровень 15, Состояние 2, Процедура проверяет, что API_GetStandardDisclaimerText проверяет, чтобы убедиться, что сообщение достаточно долго, строка 25 [Batch Start Line 3] должна объявить скалярную переменную "@ArbitraryNumberOfCharacters". Сообщение 137, Уровень 15, Состояние 2, Процедура проверяет, что API_GetStandardDisclaimerText проверяет, является ли сообщение достаточно длинным, Строка 33 [Стартовая Строка 3] Необходимо объявить скалярную переменную "@ThisShouldEqualOne".

Я в растерянности, потому что я объявил переменные, и я не выдает ошибку типа? Другие посты на stackoverflow по этой теме c, похоже, не помогли мне.

1 Ответ

0 голосов
/ 31 марта 2020

Итак, в этом коде много неправильного. Я предлагаю вам взглянуть на написание вашей переменной. В вашем коде есть как минимум 2 разных написания.

Тогда сравнение с утверждениями не имеет смысла. Разве вы не должны сравнивать @ThisShouldEqualOne с 1 вместо счетчика?

Но я рекомендую использовать tSQLt.Fail вместо установки флага и сравнения его с единицей.

Наконец, что такое цель 15К символов? Я бы предпочел go для проверки того, что конкретная c часть фактически является частью заметки. Если этот тест не пройден, он не сможет ничего рассказать о том, что пошло не так. Вместо этого я рекомендую написать тест, например [test, в котором NoteWith HTML на самом деле содержит HTML].

К этому моменту вы должны разделить тестирование двух значений на два теста. У каждого теста должна быть одна причина провала. (Если вы к этому стремитесь, вы значительно сократите затраты на обслуживание теста.)

PS: Не рекомендуется удалять временную таблицу в начале хранимой процедуры. CREATE TABLE #Actual никогда не подведет. Даже если должна существовать еще одна таблица с таким именем. Но это может иметь всевозможные последствия для производительности, если вы уроните его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...