2

私はtSQLtに非常に慣れていないため、実際には非常に単純なテストであるべきものに苦労しています。

ストアド プロシージャ内で実行される SELECT ステートメントに列を追加しました。

そのストアド プロシージャの結果セットに列が含まれていることを tSQLt テストでテストするにはどうすればよいですか?

4

2 に答える 2

1

コンテンツではなく出力の構造にのみ関心がある場合 (および SQL2012 以降で実行している場合) の別のオプションはsys.dm_exec_describe_first_result_set_for_object、テストで使用することです。

この dmo (動的管理オブジェクト) は、特定のオブジェクトに対して返された最初の結果セットに関するさまざまな情報を返します。

以下の例では、この dmo によって返されたいくつかの列のみを使用していますが、たとえば、出力に 10 進データ型が含まれている場合は、他の列を使用できます。

このテストでは、一時テーブル ( #expected) に、名前、データ型、null 可能性など、各列が返されると予想される方法に関する情報を入力します。

次に、dmo から別の一時テーブルに対応する列を選択します ( #actual)。

最後にtSQLt.AssertEqualsTable、2 つのテーブルの内容を比較します。

とはいえ、ビューやテーブルの構造を検証するためのテストを ( を使用して) 頻繁に作成していますがtSQLt.AssertResultSetsHaveSameMetaData、プロシージャの結果セット コントラクトをテストするだけの必要性を感じたことはありません。Dennis は正しいです。通常、結果セット内のさまざまな列に正しい値が入力されていることを主張したいと思うでしょう。その機能をカバーするまでには、とにかくすべての列をカバーしているはずです。

if object_id('dbo.myTable') is not null drop table dbo.myTable;
go
if object_id('dbo.myTable') is null
begin
    create table dbo.myTable
    (
      Id int not null primary key
    , ColumnA varchar(32) not null
    , ColumnB varchar(64) null
    )
end
go
if object_id('dbo.myProcedure') is not null drop procedure dbo.myProcedure;
go
create procedure dbo.myProcedure
as
begin
    select Id, ColumnA, ColumnB from dbo.myTable;
end
go

exec tSQLt.NewTestClass @ClassName = 'myTests';

if object_id('[myTests].[test result set on SQL2012+]') is not null drop procedure [myTests].[test result set on SQL2012+];
go
create procedure [myTests].[test result set on SQL2012+]
as
begin
    ; with expectedCte (name, column_ordinal, system_type_name, is_nullable)
    as
    (
        -- The first row sets up the data types for the #expected but is excluded from the expected results
                  select cast('' as nvarchar(200)), cast(0 as int), cast('' as nvarchar(200)), cast(0 as bit)
        -- This is the result we are expecting to see
        union all select 'Id', 1, 'int', 0
        union all select 'ColumnA', 2, 'varchar(32)', 0
        union all select 'ColumnB', 3, 'varchar(64)', 1
    )
    select * into #expected from expectedCte where column_ordinal > 0;

    --! Act
    select
          name
        , column_ordinal
        , system_type_name
        , is_nullable
    into
        #actual
    from
        sys.dm_exec_describe_first_result_set_for_object(object_id('dbo.myProcedure'), 0);

    --! Assert
    exec tSQLt.AssertEqualsTable '#expected', '#actual';
end
go
exec tSQLt.Run '[myTests].[test result set on SQL2012+]'
于 2014-10-17T12:42:56.183 に答える