我试图用输出参数监视一个过程。此过程有两个参数,一个输入参数和一个输出参数。
输入参数的默认值为NULL。
std::aligned_storage
我试图测试一个调用spExampleProcedure的过程。使用不同的@INPUTPARAM多次调用spExampleProcedure。我想检查该参数并根据输入返回不同的值。 (更高级的模拟。)
CREATE PROCEDURE spExampleProcedure
@INPUTPARAM DATETIME = NULL,
@OUTPUTPARAM INT = NULL OUTPUT
AS
....
这不起作用。我真的希望能够像执行函数一样伪造/窥探一个过程,因为当多次调用存储过程时它会非常有用。
我考虑过的一个选项是将我的spExampleProcedure转换为函数,但这只会避免我的问题。看看间谍程序,我发现没有理由为什么我的设置不应该工作,也许它创建的假程序可能没有默认值null。
答案 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放入表中,否则将不允许它。