必须在单元测试中声明标量变量

Posted

技术标签:

【中文标题】必须在单元测试中声明标量变量【英文标题】:Must declare scalar variable in a unit test 【发布时间】:2020-07-12 04:12:21 【问题描述】:

我正在尝试设计一个单元测试,以确保消息大于一定数量的字符。我的代码是:

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';

我收到以下错误:

消息 137,级别 15,状态 2,程序测试 API_GetStandardDisclaimerText 测试以确保消息是 足够长,第 25 行 [Batch Start Line 3] 必须声明标量 变量“@ArbitraryNumberOfCharacters”。消息 137,级别 15,状态 2, API_GetStandardDisclaimerText 测试的程序测试以确保 消息足够长,第 33 行 [Batch Start Line 3] 必须 声明标量变量“@ThisShouldEqualOne”。

我不知所措,因为我已经声明了变量并且似乎没有给出类型错误? *** 上有关此主题的其他帖子似乎对我没有帮助。

【问题讨论】:

看起来像是印刷错误。尝试将 @ArbitaryNumberOfCharactersDECLARE 复制粘贴到代码的其他部分。 好主,谢谢你....抱歉这个愚蠢的问题! 【参考方案1】:

所以,这段代码有很多问题。我建议你看看你的变量的拼写。您的代码中至少有 2 种不同的拼写。

那么,assertequals 比较就没有意义了。您不应该将 @ThisShouldEqualOne 与 1 而非计数进行比较吗?

但是,我建议使用 tSQLt.Fail 而不是设置一个标志并将其与一个标志进行比较。

最后,要求 15K 字符的目的是什么?我宁愿去测试一个特定的部分实际上是笔记的一部分。如果此测试失败,它就无法真正告诉您发生了什么问题。相反,我建议您编写类似 [test that NoteWithHTML 实际上包含 HTML] 的测试。

至此,您应该将两个值的测试分成两个测试。每个测试都应该有 1 个失败的原因。 (如果您以此为目标,您将显着降低测试维护成本。)

P.S.:在存储过程的开头删除临时表是一种不好的做法。 CREATE TABLE #Actual 永远不会失败。即使应该已经存在另一个具有该名称的表。但如果你放弃它,它可能会对性能产生各种影响。

【讨论】:

以上是关于必须在单元测试中声明标量变量的主要内容,如果未能解决你的问题,请参考以下文章

在类扩展中声明的单元测试方法

在单元测试中声明重复元素

TypeScript:仅在单元测试中找不到模块的声明文件

Automapper 无法在单元测试项目中映射外键属性

Python基础篇:单元测试unittest

Python基础篇:单元测试unittest