Microsoft Fakes におけるコード生成、コンパイル、および名前付け規則
このトピックでは、オプションの説明と) 項目の問題は、コンパイル コードを生成し、項目) が生成した型の名前付け規則、メンバー、およびパラメーターについて説明します。
要件
- Visual Studio Ultimate
このトピックの内容
ここにできるかについてです:
Code generation and compilation
コードを生成およびコンパイルします。
スタブ コード生成の構成
型のスタブの生成は .fakes のファイル拡張子を持つ XML ファイルに構成されます。項目の偽造フレームワークは、カスタム MSBuild タスクによってビルド処理で統合し、ビルド時にこれらのファイルを検出します。項目) コード ジェネレーターは、アセンブリにスタブ型がコンパイルされ、プロジェクトへの参照を追加します。
次の例では FileSystem.dll で定義されたスタブの種類の説明です:
<Fakes xmlns="https://schemas.microsoft.com/fakes/2011/">
<Assembly Name="FileSystem"/>
</Fakes>
型のフィルター処理
フィルターは .fakes ファイルの種類がぶつかるするかを制限するように設定できます。StubGeneration 要素の下に追加し、削除、選択した型の一覧を構築する要素をクリアの無制限を追加できます。
たとえば、この .fakes ファイルには、システムおよび System.IO 名前空間で、型のスタブを生成しますが、システムで "ハンドル" を含む型を除外します:
<Fakes xmlns="https://schemas.microsoft.com/fakes/2011/">
<Assembly Name="mscorlib" />
<!-- user code -->
<StubGeneration>
<Clear />
<Add Namespace="System!" />
<Add Namespace="System.IO!"/>
<Remove TypeName="Handle" />
</StubGeneration>
<!-- /user code -->
</Fakes>
フィルター文字列は一致がどのように動作するかを定義するには、単純な引数を使用します:
フィルターは、ケースと小文字を区別しない既定でです。; フィルター部分文字列は一致を実行します:
el に一致します "Hello"
フィルターの末尾に ! を追加しても、精度に大文字小文字を区別しない一致があります:
el! が一致しません "Hello"
hello! に一致します "Hello"
フィルターの末尾に * を追加しても、文字列の先頭に一致します:
el* が一致しません "Hello"
he* に一致します "Hello"
セミコロン区切りのリストを複数のフィルターは分離としてまとめられます:
el;wo は一致し、"Hello World" "
ぶつかる具象クラスと仮想メソッド
既定では、スタブの型は、非シール クラスに対して生成されます。.fakes の構成ファイルを使用して抽象クラスにスタブ型を制限する可能性があります:
<Fakes xmlns="https://schemas.microsoft.com/fakes/2011/">
<Assembly Name="mscorlib" />
<!-- user code -->
<StubGeneration>
<Types>
<Clear />
<Add AbstractClasses="true"/>
</Types>
</StubGeneration>
<!-- /user code -->
</Fakes>
厳密な名前の署名
偽造項目のフレームワークは自動的にくさびを入力アセンブリが厳密に署名すると生成された) 項目のアセンブリに署名します。偽造項目のフレームワークはアセンブリに署名するためにユーザーが別のキーを指定する同じキーを使用します。別のキーは .fakes ファイルで指定できます。
<Fakes ...>
<Compilation KeyFile="path to the key file" />
</Fakes>
内部型
項目) コード ジェネレーターが shim の型を生成し、生成された) 項目のアセンブリから参照できる型の型をぶつけます。内部型に表示することは、生成されたアセンブリに) 項目の表示を与えるくさびを入力アセンブリに InternalsVisibleTo の属性を追加できます。
[assembly: InternalsVisibleTo("FileSystem.Fakes")]
くさびを入力アセンブリが厳密に署名すると、項目の偽造フレームワークは、自動的に生成される厳密に) 項目のアセンブリに署名します。このケースでは、アセンブリの名前を参照する InternalsVisibleToAttribute の属性のニーズ、または公開キー。項目の偽造フレームワークは、アセンブリの署名に同じキーを使用して、開始点としてプロジェクトで InternalsVisibleTo 属性の追加にこのスニペットを使用します。
[assembly: InternalsVisibleTo("FileSystem.Fakes, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc")]
ビルド時間の最適化
偽造項目のアセンブリのコンパイルは、ビルドの時間を長くすることができます。偽造項目のアセンブリを生成して別の一元化されたプロジェクトの .NET アセンブリのシステムおよびサードパーティのアセンブリのビルド時間を短縮できます。このようなアセンブリには、コンピューターにほとんど変更されないため、他のプロジェクトで生成される) 項目のアセンブリを再利用できます。
単体テスト プロジェクトで、プロジェクトのフォルダーに FakesAssemblies の下に設定されているコンパイル) 項目のアセンブリへの参照を取得できます。
テスト プロジェクトに一致する .NET ランタイム バージョンを持つ新しいクラス ライブラリを作成します。これを Fakes.Prebuild を呼び出してします。不要なプロジェクトから class1.cs ファイルを削除します。
ユーザーが項目) が必要とするサードパーティのアセンブリ、すべてのシステムへの参照を追加します。
アセンブリおよびビルドの .fakes ファイルを追加します。
テスト プロジェクトから、アセンブリ参照を追加して、Fakes.Prebuild\FakesAssemblies のフォルダーを参照し、適切なアセンブリを検索します。
アセンブリの名前の衝突を回避できます。
チーム ビルド環境では、すべてのビルド出力を一つのディレクトリにマージされます。偽造項目を使用して複数のプロジェクトの場合は別のバージョンの) 項目のアセンブリが互いをオーバーライドすると発生する場合があります。たとえば、.NET Framework 2.0 から TestProject1 mscorlib.dll) 項目は、.NET Framework 4 の偽造 TestProject2 項目 mscorlib.Fakes.dll mscorlib.dll の偽造項目の両方にアセンブリを生成します。
この問題を回避するには、偽造項目は .fakes ファイルを追加すると、自動的に非プロジェクト参照のバージョンで修飾される) 項目のアセンブリ名を作成する必要があります。バージョン修飾) 項目のアセンブリ名は) 項目の名前のアセンブリを作成するときに、バージョン番号を埋め込みます:
アセンブリとバージョン 1.2.3.4 これにより、偽造項目のアセンブリ名は MyAssembly.1.2.3.4.Fakes です。
.fakes のアセンブリの要素のバージョン属性を編集してこのバージョンを変更または削除する場合:
attribute of the Assembly element in the .fakes:
<Fakes ...>
<Assembly Name="MyAssembly" Version="1.2.3.4" />
...
</Fakes>
名前付け規則) を使用します。
Shim の型およびスタブは名前付け規則を入力します。
名前空間
[.]偽造項目のサフィックスは名前空間に追加されます。
たとえば、System.Fakes の名前空間は、System 名前空間の shim の型が含まれています。
Global.Fakes は空の名前空間の shim の型が含まれています。
型名
Shim プレフィックスは型名に shim の型の名前をビルドするには追加されます。
たとえば、ShimExample は、この例の型の shim の型です。
スタブのプレフィックスは型名にスタブ型の名前をビルドするには追加されます。
たとえば、StubIExample は IExample の型のスタブの型です。
型引数、および入れ子にされた型の構造
ジェネリック型引数はコピーされません。
入れ子にされた型の構造体が shim の型にコピーします。
デリゲートのプロパティにくさびを入力するか、またはデリゲートのフィールドの名前付け規則をぶつけて。
空の名前から始まるフィールド名、の基本規則 :
メソッド名が追加されます。
メソッド名が明示的なインターフェイスの実装の場合、点は削除されます。
メソッドがジェネリックの場合、n がジェネリック メソッドの引数の数です。Ofn が追加されます。
プロパティの getter などの特殊なメソッド名 または setter は、次の表に示すように処理されます。
メソッドがある… |
例 |
追加されたメソッド名 |
---|---|---|
コンストラクター |
.ctor |
Constructor |
静的 コンストラクター |
.cctor |
StaticConstructor |
2 部分で構成される "_" でメソッド名を持つ アクセサー は区切ります (プロパティの getter など) |
kind_name (一般的なケースが、ECMA で実装されていません) |
パーツが両方とも大文字になり、交換されているNameKind、 |
プロパティの getter Prop |
PropGet |
|
プロパティの setter Prop |
PropSet |
|
Adder のイベント |
Add |
|
イベントの削除剤 |
Remove |
|
2 部分で構成される 演算子 |
op_name |
NameOp |
例: + 演算子 |
op_Add |
AddOp |
変換演算子では、戻り値の型が追加されます。 |
T op_Implicit |
ImplicitOpT |
説明
インデクサーの getter および setter はプロパティと同様に扱われます。インデクサーの既定の名前は Itemです。
パラメーターの型 の名前は変換され、連結されます。
戻り値の型 は、オーバーロードのあいまいさがない場合は無視されます。この場合、戻り値の型は、名前の末尾に追加されます
パラメーターの型の名前付け規則
指定された |
追加した文字列です… |
---|---|
型T |
T 名前空間、入れ子構造体とジェネリック tics も削除されます。 |
パラメーターout T |
TOut |
ref パラメーターref T |
TRef |
配列型T[] |
TArray |
多次元配列 の型 T[ , , ] |
T3 |
ポインター 型 T* |
TPtr |
ジェネリック型T<R1, …> |
TOfR1 |
型 C<TType>の ジェネリック型引数!i |
Ti |
メソッド M<MMethod>の ジェネリック メソッドの引数!!i |
Mi |
入れ子にされた型N.T |
N は、T追加されます。 |
再帰的な規則
次の規則は再帰的に適用されます:
偽造項目のアセンブリを生成するために項目が、C) を使用するため、C の無効なトークンを生成するいずれかの文字が "_" にエスケープします (アンダースコア)。
結果の名前を宣言している型のすべてのメンバーによって競合して、ナンバリング スキームが 01 から始まる 2 桁のカウンターの追加によって使用されます。
外部リソース
ガイダンス
Visual Studio 2012 –の章の 2 番目の一連の配信のためのテスト: 単体テスト: 内部のテスト