以下で説明するように、別のプロジェクトからmscorlib 偽の DLLを参照しようとすると問題が発生します。
MS Fakes を使用して単体テストを作成している多数の VS12 ソリューションがあります。次の URL の提案に基づいて、偽の Dll のためだけにプロジェクトを作成することにしました: Microsoft Fakes のコード生成、コンパイル、および命名規則。アイデアは、偽の DLL の場所がローカライズされ、テスト プロジェクト全体に多数の偽の DLL をばらまく必要がないということです。(これを一般的なフェイク ライブラリと呼びます。)
現在の単体テストではPresentationCore
、System.Management
とのシムを使用してSystem
います。ただし、私が使用しているシステム shim は、実際にはmscorlib.dll
、Convert (静的クラス) と DriveInfo (シール クラス) にあります。mscorlib のこれら 2 つのクラスのみが必要なので (今のところ)、mscorlib 用に次の .fakes ファイルを作成しました。
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
<Assembly Name="mscorlib" Version="4.0.0.0"/>
<StubGeneration>
<Clear/>
</StubGeneration>
<ShimGeneration>
<Clear/>
<Add FullName="Convert"/>
<Add FullName="DriveInfo"/>
</ShimGeneration>
</Fakes>
PresentationCore と SystemManagement については、同様の .fakes ファイルがあり、クラスをクリアしてから名前で追加します。
ただし、私のテスト プロジェクトでは、共通のフェイク ライブラリから mscorlib.4.0.0.0.Fakes DLL の参照を追加すると、Convert シムと DriveInfo シムを使用したテストが実行されません。代わりに、テスト メソッドは Microsoft.QualityTools.Testing.Fakes.Shims.ShimNotSupportedException をスローし、サポートされていない shimmed クラスを指定します。PresentationCore および System.Management の機能を使用するテストは、共通のフェイク ライブラリを参照する場合でも機能します。
ただし、System の Fakes アセンブリをテスト プロジェクトに直接 (および mscorlib を間接的に) 追加した場合、テスト プロジェクトにまったく同じ mscorlib.fakes ファイルを作成し、ローカルのmscorlib.4.0.0.0.Fakes Dll への参照を追加すると、一般的なフェイク ライブラリにリンクしたときに例外をスローしたテストは、問題なく実行されます。
オブジェクト ブラウザーを使用して、一般的なフェイク ライブラリの mscorlib フェイク DLL を調べ、ローカルでビルドされたものと比較したところ、同じように見えます。
一般的なフェイク ライブラリで mscorlib フェイクを参照しても機能しない理由を知っている人はいますか?