Приведенный пример должен работать, как указано Себастьяном Майном.Я хотел уточнить, почему мой тест не работает в случае, если это в конечном итоге помогает кому-то еще.
Моя проблема была связана с настройкой данных теста.
Рассмотрим:
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.ВНИМАТЕЛЬНО с данными, поступающими из поддельных таблиц.Поддельные таблицы снимают ограничения, поэтому в таблицу легко поместить ноль, который иначе не позволил бы это.