.NET StandardライブラリのMSTestでハマる
DB接続の基本機能が出来たところで、MSTestを導入したんですね。
実装が大きくならないうちにテストを書いておこう、と。
そこで、なんだか良く分からないエラーが発生したので、記録しておきます。
MSTestプロジェクトを作る
MSTestプロジェクトのビルドターゲットは、.NET Framework
のみです。
.NET Standard
や.NET Core
は、選択肢に出てきません。
テスト対象プロジェクトは.NET Standard 1.3
で作っています。
こちらの資料に基づいて、ビルドターゲットを.NET Framework 4.6
にしました。
テストプロジェクトの参照に対象プロジェクトを追加して、テストを書きました。
テスト対象インスタンス生成時に落ちた
書いたテストを実行してみると、テスト対象インスタンスを生成する箇所で落ちました。
例外メッセージは下記のとおり。
ファイルまたはアセンブリ 'System.Data.SqlClient, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。 見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
参照バイナリが読めない、と。
テストプロジェクトにも同じNuGetパッケージを読ませる必要があるかなと、NuGetパッケージを追加してみましたが、現象変わらず。
よくよくメッセージを読むと、System.Data.SqlClient, Version=4.1.0.0
と。
あれ?
.NET StandardプロジェクトのNuGetパッケージバージョンは、4.3.0
でした。
同じNuGetパッケージを、MSTestプロジェクトにも読ませています。
とはいえ.NET Framework
には、標準的にSystem.Data.SqlClient
が含まれているはず。
同梱dllを優先してしまうのかなぁ...?
NuGetパッケージをダウングレードしただけでは、ダメ
仕方がないので、制作中ライブラリのNuGetパッケージを、エラーメッセージに記載があった4.1.0
にダウングレードしました。
テストに引っ張られて実装側を変えるのはアレですが、背に腹は変えられません...。
MSTestプロジェクト側のNuGetパッケージは、削除しました。
しかしこれでも...
現象変わらずでした。
MSTestプロジェクト側に、同じく古いパッケージを入れた
さきほど、MSTest側のNuGetパッケージは削除してしまいました。
こちらにも、テスト対象プロジェクトと同様に古いバージョンを選んで、インストールしてみます。
試してみると...
ああ、よかった!
通りました!
んー、しかし。
なぜダメだったのか、理由がよく分からないままです。
スッキリしないなぁ。