【问题标题】:tSQLt SpyProcedure with Output Parameters带有输出参数的 tSQLt SpyProcedure
【发布时间】:2018-06-12 15:15:26
【问题描述】:

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

输入参数的默认值为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 转换为函数,但这只会避免我的问题。查看 spy 程序,我看不出为什么我的设置不应该工作,除了它创建的假程序可能没有默认值 null。

【问题讨论】:

  • tSQLt 在监视过程时保留OUTPUT 参数,并且设置它们的值有效。这意味着,您遇到的问题可能在其他地方。请把你的整个测试用例贴出来好吗?
  • 感谢您的评论。我开始编译我的测试用例提供给你,在这样做的同时,我注意到了问题的根源。我的存储过程使用了一个伪造的表,我没有在这个表中插入一个值。因此,当调用该过程时,该值为 null。

标签: tsqlt


【解决方案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。小心来自 Faked Tables 的数据。伪造的表删除了约束,因此很容易将 null 放入本来不允许的表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2015-01-16
    • 2018-11-09
    相关资源
    最近更新 更多