必须在单元测试中声明标量变量
Must declare scalar variable in a unit test
我正在尝试设计一个单元测试,以确保消息大于一定数量的字符。我的代码是:
EXEC tSQLt.NewTestClass 'TestMarketingEnoughRows';
GO
CREATE OR ALTER PROCEDURE TestMarketing.[test that API_GetStandardDisclaimerText tests to make sure that the message is long enough]
AS
BEGIN
DROP TABLE IF EXISTS #Actual;
CREATE TABLE #Actual
(
Note NVARCHAR(MAX),
NoteWithHTML XML
);
INSERT #Actual
(
Note,
NoteWithHTML
)
EXEC Marketing.API_GetStandardDisclaimerText @Username = 'AnyValue', -- varchar(100)
@OneParagraphPerRow = 0; -- bit
SELECT LEN(Note),
LEN(CAST(NoteWithHTML AS NVARCHAR(MAX)))
FROM #Actual;
DECLARE @ArbitaryNumberOfCharacters INT = 15000;
DECLARE @ThisShouldEqualOne BIT =
(
SELECT CASE
WHEN LEN(Note) > @ArbitraryNumberOfCharacters
AND LEN(CAST(NoteWithHTML AS NVARCHAR(MAX))) > @ArbitraryNumberOfCharacters THEN
1
ELSE
0
END
FROM #Actual
);
EXEC tSQLt.AssertEquals @Expected = @ThisShouldEqualOne, -- sql_variant
@Actual = @ArbitaryNumberOfCharacters, -- sql_variant
@Message = N'test mctestyface'; -- nvarchar(max)
END;
GO
EXEC tSQLt.Run 'TestMarketingEnoughRows';
我收到以下错误:
Msg 137, Level 15, State 2, Procedure test that
API_GetStandardDisclaimerText tests to make sure that the message is
long enough, Line 25 [Batch Start Line 3] Must declare the scalar
variable "@ArbitraryNumberOfCharacters". Msg 137, Level 15, State 2,
Procedure test that API_GetStandardDisclaimerText tests to make sure
that the message is long enough, Line 33 [Batch Start Line 3] Must
declare the scalar variable "@ThisShouldEqualOne".
我很茫然,因为我已经声明了变量,但我似乎没有给出类型错误? Whosebug 上有关此主题的其他帖子似乎对我没有帮助。
所以,这段代码有很多错误。我建议您查看变量的拼写。您的代码中至少有 2 个不同的拼写。
那么,assertequals 比较就没有意义了。您不应该将 @ThisShouldEqualOne 与 1 进行比较而不是与计数进行比较吗?
但是,我建议使用 tSQLt.Fail 而不是设置标志并将其与一个标志进行比较。
最后,要求15K字符的目的是什么?我宁愿去测试特定部分实际上是笔记的一部分。如果这个测试失败了,它不能真正告诉你什么地方出了问题。相反,我建议您编写测试,例如 [test that NoteWithHTML actually contains HTML].
至此,您应该将两个值的测试分成两个测试。每个测试都应该有 1 个失败的原因。 (如果您以此为目标,您将显着降低测试维护成本。)
P.S.: 在存储过程的开头删除临时 table 是一种不好的做法。 CREATE TABLE #Actual 永远不会失败。即使已经存在另一个具有该名称的 table。但如果你放弃它,它可能会对性能产生各种影响。
我正在尝试设计一个单元测试,以确保消息大于一定数量的字符。我的代码是:
EXEC tSQLt.NewTestClass 'TestMarketingEnoughRows';
GO
CREATE OR ALTER PROCEDURE TestMarketing.[test that API_GetStandardDisclaimerText tests to make sure that the message is long enough]
AS
BEGIN
DROP TABLE IF EXISTS #Actual;
CREATE TABLE #Actual
(
Note NVARCHAR(MAX),
NoteWithHTML XML
);
INSERT #Actual
(
Note,
NoteWithHTML
)
EXEC Marketing.API_GetStandardDisclaimerText @Username = 'AnyValue', -- varchar(100)
@OneParagraphPerRow = 0; -- bit
SELECT LEN(Note),
LEN(CAST(NoteWithHTML AS NVARCHAR(MAX)))
FROM #Actual;
DECLARE @ArbitaryNumberOfCharacters INT = 15000;
DECLARE @ThisShouldEqualOne BIT =
(
SELECT CASE
WHEN LEN(Note) > @ArbitraryNumberOfCharacters
AND LEN(CAST(NoteWithHTML AS NVARCHAR(MAX))) > @ArbitraryNumberOfCharacters THEN
1
ELSE
0
END
FROM #Actual
);
EXEC tSQLt.AssertEquals @Expected = @ThisShouldEqualOne, -- sql_variant
@Actual = @ArbitaryNumberOfCharacters, -- sql_variant
@Message = N'test mctestyface'; -- nvarchar(max)
END;
GO
EXEC tSQLt.Run 'TestMarketingEnoughRows';
我收到以下错误:
Msg 137, Level 15, State 2, Procedure test that API_GetStandardDisclaimerText tests to make sure that the message is long enough, Line 25 [Batch Start Line 3] Must declare the scalar variable "@ArbitraryNumberOfCharacters". Msg 137, Level 15, State 2, Procedure test that API_GetStandardDisclaimerText tests to make sure that the message is long enough, Line 33 [Batch Start Line 3] Must declare the scalar variable "@ThisShouldEqualOne".
我很茫然,因为我已经声明了变量,但我似乎没有给出类型错误? Whosebug 上有关此主题的其他帖子似乎对我没有帮助。
所以,这段代码有很多错误。我建议您查看变量的拼写。您的代码中至少有 2 个不同的拼写。
那么,assertequals 比较就没有意义了。您不应该将 @ThisShouldEqualOne 与 1 进行比较而不是与计数进行比较吗?
但是,我建议使用 tSQLt.Fail 而不是设置标志并将其与一个标志进行比较。
最后,要求15K字符的目的是什么?我宁愿去测试特定部分实际上是笔记的一部分。如果这个测试失败了,它不能真正告诉你什么地方出了问题。相反,我建议您编写测试,例如 [test that NoteWithHTML actually contains HTML].
至此,您应该将两个值的测试分成两个测试。每个测试都应该有 1 个失败的原因。 (如果您以此为目标,您将显着降低测试维护成本。)
P.S.: 在存储过程的开头删除临时 table 是一种不好的做法。 CREATE TABLE #Actual 永远不会失败。即使已经存在另一个具有该名称的 table。但如果你放弃它,它可能会对性能产生各种影响。