VS2010 SP1ユニットテスト3.5フレームワークをターゲットとするプライベートアクセサを使用した場合、失敗しました
-
28-10-2019 - |
質問
ソリューションをVS2008からVS2010 SP1に変換し、3.5フレームワークをターゲットにするためにユニットテストプロジェクトを変更しました。ユニットテストプロジェクトでいくつかの参照を修正する以外に、すべてが問題なく機能し、ソリューションが正常に構築されました。ほとんどのテストは正常に実行されますが、失敗したほんの一握りがありました。失敗したものは、プライベートアクセサを使用しています。個人的には、これらのテストは必要だとは思わないので、これらのテストを削除したいだけですが、SP1で潜在的なバグを明らかにしている限り、誰もが作業アラウンドを理解できるかどうかを確認しました。
テストを実行したときに受信するエラーメッセージは、「このアセンブリは、現在ロードされているランタイムよりも新しいランタイムによって構築され、ロードできない」です。私が言うことができる限り、プライベートアクセサのアセンブリは4.0ランタイムによって構築されているように見えます(おそらくMicrosoft.VisualStudio.QualityTools.unittestFrameworkを介して)が、3.5ランタイムはMSTESTによってロードされるため、結果のエラーが発生します。
Microsoft.visualStudio.qualityTools.unittestFrameworkの参照を変更して、バージョン9.0を特別に使用しました(現在は10.1)。これにより、プライベートアクセサのアセンブリがMicrosoft.visualStudio.qualityTools.unittestFrameworkのバージョン10.0を使用していることが示されているコンパイル時間エラーが発生します。
生成されたプライベートアクセサアセンブリを削除し、同様に再作成しましたが、それでも同じ問題があります。 3.5フレームワークがユニットテストプロジェクトでターゲットにされている場合、VS2010 SP1と何かが同期されていないようです。
単体テストの1つのコードは次のとおりです(繰り返しますが、非常に価値のあるテストではありませんが、それは投稿のポイントではありません...):
[TestMethod()]
public void GetNullableCharValue_DBNull_ReturnsNull_Test()
{
object value = DBNull.Value;
Nullable<char> expected = null;
Nullable<char> actual;
actual = RepositoryBase_Accessor.GetNullableCharValue(value);
Assert.AreEqual(expected, actual);
}
解決
私もこの問題に出くわしました。 Visual Studio 2010 SP1は、.NET v3.5に基づいた単体テストプロジェクトのサポートを追加します。以前は、ユニットテストは.NET4を使用することを余儀なくされていました。
があります Microsoft Connect Bug 件については、この答えを書いている日に提出されたばかりなので、Microsoftからの意味のある応答はまだありません。
私が選んだ回避策は、Visual Studio 2008ツールチェーンを使用してプライベートアクセサアセンブリを手動で生成し、ユニットテストプロジェクトから手動参照を追加することでした。
手順は次のとおりです。
1)ユニットテストから自動生成されたアクセサを削除する .csproj ファイル:
<ItemGroup>
<Shadow Include="Test References\Assembly.accessor" />
</ItemGroup>
2)V3.5互換アクセサアセンブリを使用して作成します vs2008を公表します:
"%VS90COMNTOOLS%vsvars32.bat"
publicize Assembly.dll
3)アセンブリをソースツリーフォルダーにコピーします。たとえば、フォルダーの下に Accessors
:
copy Assembly_Accessor.dll ProjectDir\Accessors\Assembly_Accessors.dll
4)Visual Studioインターフェイスを使用して、ユニットテストプロジェクトへの参照としてアクセサアセンブリを追加します。
Project -> Add Reference.. -> Browse...
5)ソリューションを構築します Ctrl+Shift+b テストを実行します。
これで、生成されたアセンブリをチェックインするか、ビルド前のイベントで自動的に作成できます。
他のヒント
このソリューションは、assebliesが署名されてバージョンされている場合、またはアクセサのクラスがある場合、機能しません。