tSQLt SpyProcedure с выходными параметрами - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь шпионить процедуру с выходным параметром.Эта процедура имеет два параметра, один входной параметр и один выходной параметр.

Входной параметр имеет значение по умолчанию NULL.

CREATE PROCEDURE spExampleProcedure
    @INPUTPARAM DATETIME = NULL,
    @OUTPUTPARAM INT = NULL OUTPUT
AS
....

Я пытаюсь протестировать вызывающую процедуруspExampleProcedure.Процедура spExampleProcedure вызывается несколько раз с другим @INPUTPARAM.Я хочу проверить этот параметр и вернуть другое значение в зависимости от ввода.(Более продвинутый вид издевательства.)

EXEC tSQLt.SpyProcedure 'dbo.spExampleProcedure', 
    'SET @OUTPUTPARAM = CASE WHEN @INPUTPARAM IS NULL THEN 1 ELSE 2 END'

Это не работает.Я действительно хотел бы иметь возможность подделать / шпионить процедуру, как я делаю функцию, потому что это действительно помогло бы, когда хранимая процедура вызывается несколько раз.

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

1 Ответ

0 голосов
/ 18 июня 2018

Приведенный пример должен работать, как указано Себастьяном Майном.Я хотел уточнить, почему мой тест не работает в случае, если это в конечном итоге помогает кому-то еще.

Моя проблема была связана с настройкой данных теста.

Рассмотрим:

CREATE PROCEDURE spExampleProcedure
    @INPUTPARAM DATETIME = NULL,
    @OUTPUTPARAM INT = NULL OUTPUT
AS
....

И

EXEC tSQLt.SpyProcedure 'dbo.spExampleProcedure', 
    'SET @OUTPUTPARAM = CASE WHEN @INPUTPARAM IS NULL THEN 1 ELSE 2 END'

Тестируемая процедура:

CREATE PROCEDURE spExampleProcedureUnderTest
        @ID INT
    AS
    BEGIN

        DECLARE @EXAMPLEVAR DATETIME, @OUTPUT
        SELECT @EXAMPLEVAR = VAR FROM ExampleTable WHERE ID = @ID

        EXEC spExampleProcedure @OUTPUTPARAM = @OUTPUT OUTPUT
        EXEC spExampleProcedure @EXAMPLEVAR, @OUTPUT OUTPUT
        ...

Моя тестовая процедура имитировала ExampleTable, но не вводила значение для VAR.

EXEC tSQLt.FakeTable 'dbo.ExampleTable'
INSERT INTO ExampleTable (ID) VALUES (1)
EXEC tSQLt.SpyProcedure 'dbo.spExampleProcedure', 
        'SET @OUTPUTPARAM = CASE WHEN @INPUTPARAM IS NULL THEN 1 ELSE 2 END'
EXEC spExampleProvedureUnderTest 1

Вместо

EXEC tSQLt.FakeTable 'dbo.ExampleTable'
INSERT INTO ExampleTable (ID, VAR) VALUES (1, '2018-06-01')
EXEC tSQLt.SpyProcedure 'dbo.spExampleProcedure', 
        'SET @OUTPUTPARAM = CASE WHEN @INPUTPARAM IS NULL THEN 1 ELSE 2 END'
EXEC spExampleProvedureUnderTest 1

ВЫДЕРЖКА В строке 2 каждого.Обратите внимание, что я добавил значение в свою вставку.

По сути, моя шпионская процедура вызывалась оба раза с NULL.ВНИМАТЕЛЬНО с данными, поступающими из поддельных таблиц.Поддельные таблицы снимают ограничения, поэтому в таблицу легко поместить ноль, который иначе не позволил бы это.

...