きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

VS2019以前で作成したデータベースの単体テストプロジェクトがVS2022で実行できない場合の対処

Visual Studio 2019(以下VS2019)以前のバージョンで作成したデータベースの単体テストプロジェクト*1をVisual Studio 2022(以下、VS2022)で開いてテスト実行すると、テストが正しく実行できない事象に遭遇しました。 その回避策についてのメモ。

※1年以上前に遭遇してメモしたのだけど、下書きのまま忘れていたので最新の環境で再確認した上で公開しておきます。

環境

今回検証たVS2019とVS2022の環境は以下の通り:

  • Visual Studio 2019 - Version 16.11.51
    • SQL Server Data Tools - 16.0.62205.05200
  • Visual Studio 2022 - Version 17.14.16
    • SQL Server Data Tools - 17.14.26.0

事前準備

VS2019で新規にデータベースプロジェクトおよびデータベースの単体テストを作成しておきます。

  • データベースプロジェクトを作成
  • スカラ値関数を一つ追加
  • 作成したスカラ値関数の単体テストを含む単体テストプロジェクトを作成
  • 単体テストを実行してグリーンであることを確認

VS2022で実行(テスト失敗)

前項で作成した、VS2019で正常に動作する単体テストをVS2022で開いて実行するとテスト失敗になります。

いくつか問題があり、対処していくにしたがって以下の例外が発生します(詳細は後述)。

Assembly Initialization method DbTestProject.SqlDatabaseSetup.InitializeAssembly threw exception. System.IO.FileNotFoundException: System.IO.FileNotFoundException: 
ファイルまたはアセンブリ 'Microsoft.Data.SqlClient, Version=5.0.0.0, Culture=neutral, PublicKeyToken=23ec7fc2d6eaa4a5'、またはその依存関係の 1 つが読み込めませんでした。
指定されたファイルが見つかりません。
Initialization method DbTestProject.MyFunc01Test.TestInitialize threw exception. System.ArgumentException: System.ArgumentException: 
キーワードはサポートされていません : 'multiple active result sets'.
Initialization method DbTestProject.MyFunc01Test.TestInitialize threw exception. System.ArgumentException: System.ArgumentException: 
キーワードはサポートされていません : 'trust server certificate'.

対処

VS2022で同様のDBプロジェクトを新規に作成した場合と比較しながら、以下のように対処したところ動作するようになりました。

1. Microsoft.Data.SqlClient をNuGetでインストール

VS2022(SQL Server Data Tools 17.14.26.0)では、明示的に Microsoft.Data.SqlClient を参照する必要がある模様。 NuGetで Microsoft.Data.SqlClient とその依存関係をインストールしてやることで解消する。 今回は現時点での最新 6.1.1 をインストールしました。

2. app.config上の接続文字列を修正

単体テストプロジェクトの app.configを開き、ExecutionContext および PrivilegedContext の接続文字列から以下の記述を削除する。

  • MultipleActiveResultSets=False
  • TrustServerCertificate=False

結果

以上の対応で、VS2022でもDB単体テストが実行できるようになりました。

VS2022でテスト成功

*1:SSDT : SQL Server Data Toolsに含まれるデータベース単体テストのこと