4

以下で説明するように、別のプロジェクトからmscorlib 偽の DLLを参照しようとすると問題が発生します。

MS Fakes を使用して単体テストを作成している多数の VS12 ソリューションがあります。次の URL の提案に基づいて、偽の Dll のためだけにプロジェクトを作成することにしました: Microsoft Fakes のコード生成、コンパイル、および命名規則。アイデアは、偽の DLL の場所がローカライズされ、テスト プロジェクト全体に多数の偽の DLL をばらまく必要がないということです。(これを一般的なフェイク ライブラリと呼びます。)

現在の単体テストではPresentationCoreSystem.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 フェイクを参照しても機能しない理由を知っている人はいますか?

4

2 に答える 2

1

Fakes の特徴は、ビルドごとに dll を再生成することです。これは、システム dll にとってそれほど重要ではありませんが、覚えておく価値があります。それらの間のリンクが shim に対してどのように機能するかがわからないため、おそらくそれらをプロジェクト内に保持する必要があります。

シムがどのように実装されているかはわかりませんが、実行時にメソッドを明らかにオーバーライドします。開発者にもっと詳しく答えてもらう必要があると思いますが、(設計上) Fakes のサポートが不安定な mscorlib の問題でさえあるかもしれません。

ただし、最終的には、偽物が同期を失うリスクを冒しながら、テスト プロジェクトで数回のクリックを節約することが目標のようです。それが起こる可能性は重要ではありません - おそらくあなたのテストをあまり明示的にする価値はありません。

テストの目的はメンテナンス コストを削減することです。そのため、通常のコードに比べて、何かを隠すことはあまり重要ではありません。メンテナンス プロセスにステップを追加するだけです。Fakes は、ほとんどの人にとって十分に難解であり、「ああ、でも間接的に参照されている.

于 2013-10-14T19:42:53.193 に答える