带有输出参数的 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 中,否则将不允许它。
我正在尝试使用输出参数监视过程。此程序有两个参数,一个输入参数和一个输出参数。
输入参数的默认值为 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 中,否则将不允许它。