0

tSQLtAssertResultSetsHaveSameMetaDataを使用して、多数の列を返すクエリからメタデータをチェックしようとしています。

失敗すると、「予想される/だった」という詳細を示すメッセージが切り捨てられるため、2 つの情報から何が問題なのかを確認できません。メッセージが切り捨てられないように (たとえば、ファイルに) 出力する方法はありますか?

4

2 に答える 2

1

実際に何をテストしているかによって異なります。幅広い結果セットでは、AssertResultsSetsHaveSameMetaData からの出力が少し扱いに​​くいことに同意します。ストアド プロシージャの場合、次のようにテストを記述します。

create procedure [ProcedureTests].[テスト SelectProcedure 結果セット コントラクト]
なので
始める
    テーブルを作成 #expected
    (
      name varchar(500) が null ではない
    、column_ordinal int 非 null ID(1,1)
    、system_type_name varchar(500) が null ではない
    、nullability varchar(16) が null ではない
    )

   ; expectedCte (名前、system_type_name、Nullability) を使用
    なので
    (
                  'ItemId' 、 'int' 、 'not null' を選択
        union all select 'ActorId' , 'int' , 'not null'
        union all select 'LanId' , 'nvarchar(200)' , 'not null'
        union all select 'ConsumerId' , 'int' , 'not null'
        union all select 'ConsumerMoniker' , 'nvarchar(200)' , 'not null'
        union all select 'ProfileTypeId' , 'int' , 'not null'
        union all select 'ProfileTypeName' , 'varchar(50)' , 'not null'
        union all select 'ProfileId' , 'int' , 'not null'
    )
    挿入#期待
    (
      名前
    、system_type_name
    、null可能性
    )
    名前、system_type_name、expectedCte からの Nullability を選択します。

    ――!活動
    選択する
          名前
        、column_ordinal
        、system_type_name
        , case is_nullable when 1 then 'null' else 'not null' end as [Nullability]
    の中へ
        #実際
    から
        sys.dm_exec_describe_first_result_set_for_object(object_id('mySchema.SelectProcedure'), 0);

    ――!主張する
    exec tSQLt.AssertEqualsTable #expected, #actual;
終わり;
行く

ビューの場合は、この(わずかに異なる)アプローチを使用できます。

手順の変更 [ViewTests].[ViewName 結果セット コントラクトのテスト]
なので
始める
    テーブルを作成 [ViewTests].[期待される]
    (
      TransactionId int が null ではない
    、SourceId int が null でない
    、SourceKey nvarchar(50) が null ではない
    、TransactionTypeId int 非 null
    、TransactionStatusId int 非 null
    、LastModified 日時が null ではない
    );
    ――!比較はこれと同じくらい簡単かもしれません(ただし、以下の代替アプローチを参照してください)
    exec tSQLt.AssertEqualsTableSchema '[ViewTests].[期待される]', 'mySchema.ViewName';


    ――!
    ――!dm_exec_describe_first_result_set の is_nullable カラムのようです (tSQLt.AssertEqualsTableSchema で使用)
    ――!ビューが関係する場合は少し不安定になる可能性があるため、テスト時にnull可能性を無視する必要がある場合があります
    ――!このビュー (両方の SELECT でその列をコメントアウトします)
    ――!
    選択する
          c.name as [ColumnName]
        、c.column_id as [ColumnPosition]
        、 場合
            when st.name in ('char', 'varchar', 'varbinary')
                then st.name + '(' + case when c.max_length = -1 then 'max' else 合体 (cast(c.max_length as varchar(8)), '???') end + ')'
            when st.name in ('nchar', 'nvarchar')
                then st.name + '(' + case when c.max_length = -1 then 'max' else 合体 (cast(c.max_length / 2 as varchar(8)), '???') end + ')'
            when st.name in ('decimal', 'numeric')
                次に st.name + '(' + 合体 (キャスト (c.precision as varchar(8)), '???') + ',' + 合体 (キャスト(c.scale as varchar(8)), '? ??') + ')'
            when st.name in ('time', 'datetime2', 'datetimeoffset')
                その後 st.name + '(' + 合体 (キャスト (c.precision as varchar(8)), '???') + ')'
            それ以外の st.name
            [データ型] として終了
        、c.[精度] as [NumericScale]
        、c.scale as [NumericPrecision]
        、c.collat​​ion_name as [Collat​​ionName]
        , cast(case c.is_nullable when 1 then 'null' else 'not null' end as varchar(16)) as [Nullability]
    の中へ
        #期待される
    から
        sys.columns as c
    内部結合 sys.types を st として
        st.system_type_id = c.system_type_id で
        および st.user_type_id = c.user_type_id
    どこ
        c.[object_id] = object_id('[ViewTests].[expected]')

    選択する
          [ColumnName] として名前を付けます
        、column_ordinal as [ColumnPosition]
        、[DataType] としての system_type_name
        、[精度] as [NumericScale]
        、[NumericPrecision] としてスケーリング
        、collat​​ion_name as [Collat​​ionName]
        , cast(case is_nullable when 1 then 'null' else 'not null' end as varchar(16)) as [Nullability]
    の中へ
        #実際
    から
        sys.dm_exec_describe_first_result_set('select * from mySchema.ViewName, null, null)

    exec tSQLt.AssertEqualsTable '#expected', '#actual' ;
終わり
行く

何らかの障害が発生した場合でも、出力が AssertEqualsTable に似ているため、理由はより明確になります。

于 2017-04-12T06:49:36.657 に答える