带有输出参数的 tSQLt SpyProcedure

tSQLt SpyProcedure with Output Parameters

我正在尝试使用输出参数监视过程。此程序有两个参数,一个输入参数和一个输出参数。

输入参数的默认值为 NULL。

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

我正在尝试测试调用 spExampleProcedure 的过程。使用不同的 @INPUTPARAM 多次调用 spExampleProcedure。我想根据输入检查 param 和 return 不同的值。 (一种更高级的模拟。)

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

这是行不通的。我真的很想 fake/spy 一个过程,就像我做一个函数一样,因为当一个存储过程被多次调用时,它真的很有帮助。

我考虑过的一个选项是将我的 spExampleProcedure 转换为函数,但这只会避免我的问题。查看间谍程序,我看不出为什么我的设置不能正常工作,也许它创建的伪造程序可能没有默认值 null。

张贴的例子应该像塞巴斯蒂安梅内指出的那样工作。我想详细说明为什么我的测试不起作用,以防最终帮助其他人。

我的问题与我的测试数据设置有关。

考虑:

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。小心来自伪造表的数据。伪造的 tables 删除了约束,因此很容易将 null 放入 table 中,否则将不允许它。