ユニットテストでスカラー変数を宣言する必要があります

PolarVortex8:

私は、メッセージが特定の文字数よりも大きいことを保証ユニットテストを設計しようとしています。私のコードは次のとおりです。

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 [バッチ開始行3]はスカラー変数「@ArbitraryNumberOfCharacters」を宣言する必要があります。メッセージ137、レベル15、状態2は、API_GetStandardDisclaimerTextテストは、メッセージが十分な長さであることを確認することをプロシージャのテストは、ライン33 [バッチ開始行3]はスカラー変数「@ThisShouldEqualOne」を宣言する必要があります。

私は、変数を宣言しているので、私は途方に暮れていると私は型エラーを与えるように見えませんか?このトピックに関するstackoverflowの上の他の記事は、私を助けていないようでした。

セバスチャンマイ:

だから、このコードの多くの間違っているがあります。私はあなたの変数のスペルを見てお勧めします。あなたのコード内の少なくとも2つの異なるスペルがあります。

その後、のassertEqualsの比較は意味がありません。あなたは1に代わりのカウントに@ThisShouldEqualOneを比較するべきではないでしょうか。

しかし、私はtSQLt.Failを使用しての代わりにフラグを設定し、その1つを比較することをお勧めします。

最後に、15Kの文字を必要とする目的は何ですか?私はむしろ、特定の部分は、実際にノートの一部であることをテストするために行くだろう。このテストが失敗した場合、それは本当にあなたに何が悪かったのかについては何も言うことができません。代わりに、私はあなたが[NoteWithHTMLが実際にHTML含まれていることをテスト]のようなテストを書くことをお勧めします。

その時点までに、次の2つのテストに2つの値をテスト区切る必要があります。各テストは失敗する1つの理由を持っている必要があります。(あなたが大幅にテストのメンテナンスコストを削減するだろうことを目指す場合。)

PS:それは、ストアドプロシージャの先頭で一時テーブルをドロップする悪い習慣です。TABLE #Actualが失敗することはありませんCREATE。すでに存在し、その名前を持つ別のテーブルがあるべき場合であっても。あなたはそれをドロップした場合しかし、それはパフォーマンスへの影響のすべての種類を持つことができます。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=377678&siteId=1