Try .NET Core

.NET Coreを動かした、試した記録を書き残します。

.NET StandardライブラリのMSTestでハマる

DB接続の基本機能が出来たところで、MSTestを導入したんですね。
実装が大きくならないうちにテストを書いておこう、と。
そこで、なんだか良く分からないエラーが発生したので、記録しておきます。

MSTestプロジェクトを作る

MSTestプロジェクトのビルドターゲットは、.NET Frameworkのみです。
.NET Standard.NET Coreは、選択肢に出てきません。

テスト対象プロジェクトは.NET Standard 1.3で作っています。
こちらの資料に基づいて、ビルドターゲットを.NET Framework 4.6にしました。

テストプロジェクトの参照に対象プロジェクトを追加して、テストを書きました。

参考:
.NET Standard Library


テスト対象インスタンス生成時に落ちた

書いたテストを実行してみると、テスト対象インスタンスを生成する箇所で落ちました。
f:id:try_dot_net_core:20161215103644j:plain

例外メッセージは下記のとおり。

ファイルまたはアセンブリ '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にダウングレードしました。
テストに引っ張られて実装側を変えるのはアレですが、背に腹は変えられません...。 f:id:try_dot_net_core:20161215105848j:plain

MSTestプロジェクト側のNuGetパッケージは、削除しました。

しかしこれでも... f:id:try_dot_net_core:20161215110643j:plain
現象変わらずでした。


MSTestプロジェクト側に、同じく古いパッケージを入れた

さきほど、MSTest側のNuGetパッケージは削除してしまいました。
こちらにも、テスト対象プロジェクトと同様に古いバージョンを選んで、インストールしてみます。
f:id:try_dot_net_core:20161215111245j:plain

試してみると... f:id:try_dot_net_core:20161215111500j:plain
ああ、よかった!
通りました!

んー、しかし。
なぜダメだったのか、理由がよく分からないままです。
スッキリしないなぁ。

ここまでの実装ソース