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 형식 및 스텁 형식을 생성합니다.The Fakes code generator will generate shim types and stub types for types that are visible to the generated Fakes assembly. Fakes에 표시되는 shim된 어셈블리 및 테스트 어셈블리의 내부 형식을 만들려면 생성된 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")]  

대체 키를 KeyFile 특성 값으로 .fakes 파일의 Fakes\Compilation 요소에 포함하는 .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>  

그런 다음 대체 .snk 파일의 공용 키를 Fakes 어셈블리에 대한 InternalVisibleTo 특성의 두 번째 매개 변수로 shim된 어셈블리 코드에서 사용해야 합니다.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 시스템 어셈블리 및 타사 어셈블리에 대한 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

팀 빌드 환경에서는 모든 빌드 출력이 단일 디렉터리에 병합됩니다.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 fakes mscorlib.dll과 .NET Framework 4의 TestProject2 fakes mscorlib.dll 모두 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에서 어셈블리 요소의 버전 특성을 편집하여 변경하거나 제거할 수 있습니다.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 prefix is added to the type name to build the stub type name.

    예를 들어 StubIExample은 IExample 형식의 스텁 형식입니다.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.

    getter 또는 setter 속성과 같은 특수 메서드 이름은 다음 표에 설명된 대로 처리됩니다.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
메서드 이름이 ""로 구분되는 두 부분으로 구성된 접근자(예: 속성 getter)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
Prop 속성의 getterGetter of property Prop PropGet
Prop 속성의 setterSetter of property Prop PropSet
이벤트 adderEvent adder Add
이벤트 removerEvent remover Remove
두 부분으로 구성된 연산자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

  • 인덱서의 getter 및 setter는 속성과 유사하게 처리됩니다.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

네임스페이스, 중첩 구조 및 제네릭 tics가 삭제됩니다.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부터 시작하는 두 자리 카운터를 추가하여 번호 매기기 구성표를 사용합니다.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