Microsoft Fakes におけるコード生成、コンパイル、および名前付け規則Code generation, compilation, and naming conventions in Microsoft Fakes

このトピックでは、Fakes のコード生成とコンパイルのオプションと問題について説明し、Fakes で生成される型、メンバー、およびパラメーターの名前付け規則について説明します。This topic discusses options and issues in Fakes code generation and compilation, and describes the naming conventions for Fakes generated types, members, and parameters.

RequirementsRequirements

  • Visual Studio EnterpriseVisual Studio Enterprise

このトピックの内容In this topic

コードの生成とコンパイルCode generation and compilation

スタブのコード生成を構成するConfiguring code generation of stubs

スタブ型の生成は、.fakes ファイル拡張子を持つ XML ファイルで構成されます。The generation of stub types is configured in an XML file that has the .fakes file extension. Fakes フレームワークは、カスタム MSBuild タスクによってビルド処理で統合され、ビルド時にそれらのファイルを検出します。The Fakes framework integrates in the build process through custom MSBuild tasks and detects those files at build time. Fakes コード ジェネレーターは、スタブ型をアセンブリにコンパイルし、参照をプロジェクトに追加します。The Fakes code generator compiles the stub types into an assembly and adds the reference to the project.

次の例に、FileSystem.dll で定義されたスタブ型を示します。The following example illustrates stub types defined in FileSystem.dll:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">  
    <Assembly Name="FileSystem"/>  
</Fakes>  

型のフィルター処理Type filtering

.fakes ファイルでフィルターを設定して、スタブされる型を制限できます。Filters can be set in the .fakes file to restrict which types should be stubbed. StubGeneration 要素の下に Clear、Add、Remove 要素を無制限に追加して、選択された型の一覧を作成できます。You can add an unbounded number of Clear, Add, Remove elements under the StubGeneration element to build the list of selected types.

たとえば、次の .fakes ファイルは、System および System.IO 名前空間の下に型のスタブを生成しますが、System では "Handle" が含まれる型は除外します。For example, this .fakes file generates stubs for types under the System and System.IO namespaces, but excludes any type containing "Handle" in System:

<Fakes xmlns="http://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>  

フィルター文字列では、単純な文法を使用して一致の照合方法を定義します。The filter strings use a simple grammar to define how the matching should be done:

  • 既定では、フィルターは大文字と小文字を区別しません。フィルターは部分文字列の一致を照合します。Filters are case-insensitive by default; filters perform a substring matching:

    el は "hello" に一致しますel matches "hello"

  • フィルターの末尾に ! を追加すると、正確な大文字小文字を区別する照合が行われます。Adding ! to the end of the filter will make it a precise case-sensitive match:

    el! は "hello" に一致しませんel! does not match "hello"

    hello! は "hello" に一致しますhello! matches "hello"

  • フィルターの末尾に * を追加すると、文字列のプレフィックスとの一致が照合されます。Adding * to the end of the filter will make it match the prefix of the string:

    el* は "hello" に一致しませんel* does not match "hello"

    he* は "hello" に一致しますhe* matches "hello"

  • セミコロン区切りのリストに複数のフィルターを記述すると、フィルターは論理和として組み合わされます。Multiple filters in a semicolon-separated list are combined as a disjunction:

    el;wo は "hello" と "world" に一致します。el;wo matches "hello" and "world"

具象クラスと仮想メソッドをスタブするStubbing concrete classes and virtual methods

既定では、スタブ型はすべての非シール クラスに対して生成されます。By default, stub types are generated for all non-sealed classes. .fakes 構成ファイルで指定して、スタブ型を抽象クラスに制限することができます。It is possible to restrict the stub types to abstract classes through the .fakes configuration file:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">  
  <Assembly Name="mscorlib" />  
  <!-- user code -->  
  <StubGeneration>  
    <Types>  
      <Clear />  
      <Add AbstractClasses="true"/>  
    </Types>  
  </StubGeneration>  
  <!-- /user code -->  
</Fakes>  

内部型Internal types

Fakes コード ジェネレーターは、生成された Fakes アセンブリから見える型の shim 型と stub 型を生成します。The Fakes code generator will generate shim types and stub types for types that are visible to the generated Fakes assembly. shim が適用されたアセンブリの内部型を Fakes アセンブリおよびテスト アセンブリから見えるようにするには、生成された Fakes アセンブリとテスト アセンブリに可視性を与える、shim が適用されたアセンブリ コードに InternalsVisibleToAttribute 属性を追加します。To make internal types of a shimmed assembly visible to Fakes and your test assembly, add InternalsVisibleToAttribute attributes to the shimmed assembly code that gives visibility to the generated Fakes assembly and to the test assembly. 次に例を示します。Here's an example:

// FileSystem\AssemblyInfo.cs  
[assembly: InternalsVisibleTo("FileSystem.Fakes")]  
[assembly: InternalsVisibleTo("FileSystem.Tests")]  

厳密な名前を持つアセンブリの内部型Internal types in strongly named assemblies

shim が適用されたアセンブリが厳密な名前を持つ場合に、アセンブリの内部型にアクセスするには、If the shimmed assembly is strongly named and you want access internal types of the assembly:

  • テスト アセンブリと Fakes アセンブリの両方に、厳密な名前を付ける必要があります。Both your test assembly and the Fakes assembly must be strongly named.

  • テスト アセンブリと Fakes アセンブリの公開キーを、shim が適用されたアセンブリの InternalsVisibleToAttribute 属性に追加する必要があります。You must add the public keys of the test and Fakes assembly to the InternalsVisibleToAttribute attributes in the shimmed assemblies. 以下に、shim が適用されたアセンブリが厳密な名前を持つとき、shim が適用されたアセンブリ コード内のサンプル属性がどのように表示されるかを示します。Here's how our example attributes in the shimmed assembly code would look when the shimmed assembly is strongly named:

    // FileSystem\AssemblyInfo.cs  
    [assembly: InternalsVisibleTo("FileSystem.Fakes",  
        PublicKey=<Fakes_assembly_public_key>)]  
    [assembly: InternalsVisibleTo("FileSystem.Tests",  
        PublicKey=<Test_assembly_public_key>)]  
    

    shim が適用されたアセンブリが厳密な名前を持つ場合、Fakes フレームワークは生成された Fakes アセンブリに自動的に厳密な名前で署名します。If the shimmed assembly is strongly named, the Fakes framework will automatically strongly sign the generated Fakes assembly. テスト アセンブリに厳密な名前で署名する必要があります。You have to strong sign the test assembly. 厳密な名前付きアセンブリの作成と使用」をご覧ください。See Creating and Using Strong-Named Assemblies.

    Fakes フレームワークは、生成されるすべてのアセンブリに同じキーを使って署名するため、このスニペットを開始点として使って Fakes アセンブリの InternalsVisibleTo 属性を shim が適用されたアセンブリ コードに追加することができます。The Fakes framework uses the same key to sign all generated assemblies, so you can use this snippet as a starting point to add the InternalsVisibleTo attribute for the fakes assembly to your shimmed assembly code.

[assembly: InternalsVisibleTo("FileSystem.Fakes, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc")]  

.fakes ファイルの Fakes\Compilation 要素に、KeyFile 属性値として代替キーを含む .snk ファイルへの完全パスを指定して、shim が適用されたアセンブリ用に作成したキーなどの別の公開キーを Fakes アセンブリに指定することができます。You can specify a different public key for the Fakes assembly, such as a key you have created for the shimmed assembly, by specifying the full path to the .snk file that contains the alternate key as the KeyFile attribute value in the Fakes\Compilation element of the .fakes file. 例:For example:

<-- FileSystem.Fakes.fakes -->  
<Fakes ...>  
  <Compilation KeyFile="full_path_to_the_alternate_snk_file" />  
</Fakes>  

shim が適用されたアセンブリ コード内の Fakes アセンブリの InternalVisibleTo 属性の 2 番目のパラメーターとして、代替 .snk ファイルの公開キーを使う必要があります。You then have to use the public key of the alternate .snk file as the second parameter of the InternalVisibleTo attribute for the Fakes assembly in the shimmed assembly code:

// FileSystem\AssemblyInfo.cs  
[assembly: InternalsVisibleTo("FileSystem.Fakes",  
    PublicKey=<Alternate_public_key>)]  
[assembly: InternalsVisibleTo("FileSystem.Tests",  
    PublicKey=<Test_assembly_public_key>)]  

上の例で、値 Alternate_public_keyTest_assembly_public_key は同じでもかまいません。In the example above, the values Alternate_public_key and the Test_assembly_public_key can be the same.

ビルド時間を最適化するOptimizing build times

Fakes アセンブリのコンパイルで、ビルド時間が非常に長くなることがあります。The compilation of Fakes assemblies can significantly increase your build time. 別の一元化されたプロジェクトで .NET System のアセンブリとサードパーティのアセンブリの Fakes アセンブリを生成することで、ビルド時間を最小限に抑えることができます。You can minimize the build time by generating the Fakes assemblies for .NET System assemblies and third-party assemblies in a separate centralized project. こういうアセンブリはコンピューターでほとんど変更されないため、生成された Fakes アセンブリを他のプロジェクトで再利用できます。Because such assemblies rarely change on your machine, you can reuse the generated Fakes assemblies in other projects.

単体テスト プロジェクトから、プロジェクト フォルダーの FakesAssemblies の下に置かれたコンパイル済みの Fakes アセンブリへの参照を取得できます。From your unit test projects, you can simply take a reference to the compiled Fakes assemblies that are placed under the FakesAssemblies in the project folder.

  1. テスト プロジェクトに一致する .NET ランタイム バージョンを含む新しいクラス ライブラリを作成します。Create a new Class Library with the .NET runtime version matching your test projects. これに Fakes.Prebuild という名前を付けます。Let's call it Fakes.Prebuild. プロジェクトから不要な class1.cs ファイルを削除します。Remove the class1.cs file from the project, not needed.

  2. Fakes が必要なすべてのシステムおよびサードパーティのアセンブリへの参照を追加します。Add reference to all the System and third-party assemblies you need Fakes for.

  3. アセンブリごとに .fakes ファイルを追加し、ビルドします。Add a .fakes file for each of the assemblies and build.

  4. テスト プロジェクトからFrom your test project

    • Fakes ランタイム DLL への参照があることを確認します。Make sure that you have a reference to the Fakes runtime DLL:

      C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dllC:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll

    • Fakes を作成したアセンブリごとに、プロジェクトの Fakes.Prebuild\FakesAssemblies フォルダーの対応する DLL ファイルへの参照を追加します。For each assembly that you have created Fakes for, add a reference to the corresponding DLL file in the Fakes.Prebuild\FakesAssemblies folder of your project.

アセンブリ名の競合を回避するAvoiding assembly name clashing

チーム ビルド環境では、すべてのビルド出力が 1 つのディレクトリにマージされます。In a Team Build environment, all build outputs are merged into a single directory. 複数のプロジェクトが Fakes を使用している場合は、異なるバージョンの Fakes アセンブリが互いにオーバーライドすることがあります。In the case of multiple projects using Fakes, it might happen that Fakes assemblies from different version override each other. たとえば、.NET Framework 2.0 からの TestProject1 による mscorlib.dll の Fakes 処理と .NET Framework 4 の TestProject2 による mscorlib.dll の Fakes 処理は、いずれも mscorlib.Fakes.dll Fakes アセンブリを生成します。For example, TestProject1 fakes mscorlib.dll from the .NET Framework 2.0 and TestProject2 fakes mscorlib.dll for the .NET Framework 4 would both yield to a mscorlib.Fakes.dll Fakes assembly.

この問題を回避するには、.fakes ファイルを追加するとき、Fakes 処理で非プロジェクト参照用にバージョンで修飾された Fakes アセンブリ名を自動的に作成する必要があります。To avoid this issue, Fakes should automatically create version qualified Fakes assembly names for non-project references when adding the .fakes files. バージョンで修飾された Fakes アセンブリ名の場合は、Fakes アセンブリ名を作成するときにバージョン番号が埋め込まれます。A version-qualified Fakes assembly name embeds a version number when you create the Fakes assembly name:

アセンブリ MyAssembly とバージョン 1.2.3.4 の場合、Fakes アセンブリ名は MyAssembly.1.2.3.4.Fakes です。Given an assembly MyAssembly and a version 1.2.3.4, the Fakes assembly name is MyAssembly.1.2.3.4.Fakes.

.fakes の Assembly 要素の Version 属性を編集して、このバージョンを変更または削除できます。You can change or remove this version by the editing the Version attribute of the Assembly element in the .fakes:

attribute of the Assembly element in the .fakes:  
<Fakes ...>  
  <Assembly Name="MyAssembly" Version="1.2.3.4" />  
  ...  
</Fakes>  

Fakes 名前付け規則Fakes naming conventions

Shim 型とスタブ型の名前付け規則Shim type and stub type naming conventions

名前空間Namespaces

  • .Fakes サフィックスは名前空間に追加されます。.Fakes suffix is added to the namespace.

    たとえば、System.Fakes 名前空間には System 名前空間の shim 型が含まれています。For example, System.Fakes namespace contains the shim types of System namespace.

  • Global.Fakes には、空の名前空間の shim 型が含まれています。Global.Fakes contains the shim type of the empty namespace.

    型名Type names

  • Shim プレフィックスが型名に追加されて、shim 型名が作成されます。Shim prefix is added to the type name to build the shim type name.

    たとえば、ShimExample は Example 型の shim 型です。For example, ShimExample is the shim type of the Example type.

  • Stub プレフィックスが型名に追加されて、stub 型名が作成されます。Stub prefix is added to the type name to build the stub type name.

    たとえば、StubIExample は IExample 型の stub 型です。For example, StubIExample is the stub type of the IExample type.

    型引数および入れ子にされた型の構造体Type Arguments and Nested Type Structures

  • ジェネリック型の引数がコピーされます。Generic type arguments are copied.

  • shim 型の場合、入れ子にされた型の構造体がコピーされます。Nested type structure is copied for shim types.

Shim デリゲート プロパティまたはスタブ デリゲート フィールドの名前付け規則Shim delegate property or stub delegate field naming conventions

空の名前から始まるフィールド名の付け方の基本的な規則は次のとおりです。Basic rules for field naming, starting from an empty name:

  • メソッド名が追加されます。The method name is appended.

  • メソッド名が明示的なインターフェイスの実装の場合、ドットは削除されます。If the method name is an explicit interface implementation, the dots are removed.

  • メソッドがジェネリックの場合、Ofn が追加されます。n はジェネリック メソッドの引数の数です。If the method is generic, Ofn is appended where n is the number of generic method arguments.

    プロパティの get/set アクセス操作子などの特殊なメソッド名は、次の表に示すように処理されます。Special method names such as property getter or setters are treated as described in the following table.

メソッドの種類If method is... Example 追加されるメソッド名Method name appended
コンストラクターA constructor .ctor Constructor
静的コンストラクターA static constructor .cctor StaticConstructor
"" で区切られた 2 つの部分で構成されるメソッド名を持つアクセサー (プロパティの get アクセス操作子など)An accessor with method name composed of two parts separated by "" (such as property getters) kind_name (一般的なケース。ただし ECMA で強制されていない)kind_name (common case, but not enforced by ECMA) NameKind。両方のパーツが大文字になり、前後が逆になっていますNameKind, where both parts have been capitalized and swapped
プロパティの get アクセス操作子 PropGetter of property Prop PropGet
プロパティの set アクセス操作子 PropSetter of property Prop PropSet
イベントを追加する操作子Event adder Add
イベントを削除する操作子Event remover Remove
2 つの部分で構成される演算子An operator composed of two parts op_name NameOp
例: + 演算子For example: + operator op_Add AddOp
変換演算子の場合は、戻り値の型が追加されます。For a conversion operator, the return type is appended. T op_Implicit ImplicitOpT

Notes

  • インデクサーの get および set アクセス操作子は、プロパティと同様に扱われます。Getters and setters of indexers are treated similarly to the property. インデクサーの既定の名前は Item です。The default name for an indexer is Item.

  • パラメーターの型の名前は変換され、連結されます。Parameter type names are transformed and concatenated.

  • 戻り値の型は、オーバーロードのあいまいさがない場合は無視されます。Return type is ignored unless there's an overload ambiguity. あいまいさがある場合は、戻り値の型が名前の末尾に追加されますIf this is the case, the return type is appended at the end of the name

パラメーターの型の名前付け規則Parameter type naming conventions

種類Given 追加される文字列Appended string is...
TA typeT TT

名前空間、入れ子になった構造体、およびジェネリック チックは削除されます。The namespace, nested structure, and generic tics are dropped.
out パラメーター out TAn out parameterout T TOut
ref パラメーター ref TA ref parameter ref T TRef
配列型 T[]An array typeT[] TArray
多次元配列T[ , , ]A multi-dimensional array type T[ , , ] T3
ポインターT*A pointer type T* TPtr
ジェネリック型 T<R1, ...>A generic typeT<R1, ...> TOfR1
C<TType>ジェネリック型引数 !iA generic type argument!i of type C<TType> Ti
メソッド M<MMethod>ジェネリック メソッド引数 !!iA generic method argument!!i of method M<MMethod> Mi
入れ子にされた型 N.TA nested typeN.T N が追加され、その後に TN is appended, then T

再帰的な規則Recursive rules

次の規則は再帰的に適用されます。The following rules are applied recursively:

  • Fakes は C# を使用して Fakes アセンブリを生成するため、無効な C# トークンを生成する文字は "" (アンダースコア) にエスケープされます。Because Fakes uses C# to generate the Fakes assemblies, any character that would produce an invalid C# token is escaped to "" (underscore).

  • 結果の名前が宣言する型のいずれかのメンバーと競合する場合は、01 から始まる 2 桁のカウンターの追加して番号付けスキーマが使用されます。If a resulting name clashes with any member of the declaring type, a numbering scheme is used by appending a two-digit counter, starting at 01.

外部リソースExternal resources

ガイダンスGuidance

Visual Studio 2012 を使用した継続的配信のためのテスト - 第 2 章: 単体テスト: 内部のテストTesting for Continuous Delivery with Visual Studio 2012 - Chapter 2: Unit Testing: Testing the Inside

関連項目See Also

Microsoft Fakes を使用したテストでのコードの分離Isolating Code Under Test with Microsoft Fakes