带有输出参数的tSQLt SpyProcedure

时间:2018-06-12 15:15:26

标签: tsqlt

我试图用输出参数监视一个过程。此过程有两个参数,一个输入参数和一个输出参数。

输入参数的默认值为NULL。

std::aligned_storage

我试图测试一个调用spExampleProcedure的过程。使用不同的@INPUTPARAM多次调用spExampleProcedure。我想检查该参数并根据输入返回不同的值。 (更高级的模拟。)

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

这不起作用。我真的希望能够像执行函数一样伪造/窥探一个过程,因为当多次调用存储过程时它会非常有用。

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

1 个答案:

答案 0 :(得分:1)

发布的例子应该像Sebastian Meine所指出的那样工作。我想详细说明为什么我的测试不起作用以防最终帮助其他人。

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

考虑:

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