다음을 통해 공유


Microsoft Fakes의 코드 생성, 컴파일 및 명명 규칙

이 항목에서는 Fakes 코드 생성 및 컴파일의 옵션과 문제점에 대해 설명하고, Fakes 생성 형식, 멤버 및 매개 변수의 명명 규칙에 대해 설명합니다.

요구 사항

  • Visual Studio Ultimate •

항목 내용

코드 생성 및 컴파일

  • 스텁 코드 생성 구성하기 • 유형 필터링하기 • 구체적인 클래스와 가상 메서드 스텁하기 • 내부 유형 • 빌드 시간 최적화하기 • 어셈블리 이름 충돌 방지하기

Fakes 명명 규칙

  • Shim 입력 및 스텁 명명 규칙 • Shim 대리자 속성 또는 스텁 대리자 필드 명명 규칙 • 매개 변수 형식 명명 규칙 • 재귀 규칙

외부 리소스

  • 지침

코드 생성 및 컴파일

스텁의 코드 생성 구성

스텁 형식의 생성은 .fakes 파일 확장명을 갖는 XML 파일에 구성되어 있습니다.Fakes 프레임워크는 사용자 지정 MSBuild 작업을 통해 빌드 프로세스로 통합되고 빌드 시 이러한 파일을 검색합니다.Fakes 코드 생성기는 스텁 형식을 어셈블리로 컴파일하고 참조를 프로젝트에 추가합니다.

다음 예제는 FileSystem.dll에 정의된 스텁 형식을 보여 줍니다.

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

형식 필터링

.fakes 파일에 필터를 설정하여 스텁할 형식을 제한할 수 있습니다.StubGeneration 요소 아래에 Clear, Add, Remove 요소를 제한 없이 추가하여 선택한 형식 목록을 작성할 수 있습니다.

예를 들어 .fakes 파일은 형식별로 System 및 System.IO 네임스페이스에서 스텁을 생성하지만 시스템에서 "처리(Handle)"를 포함하는 모든 유형을 제외시킵니다.

<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 어셈블리에 표시되는 형식의 shim 형식과 stub 형식을 생성합니다.shimmed 어셈블리의 내부 형식을 Fakes 및 테스트 어셈블리에 표시하려면 생성된 Fakes 어셈블리와 테스트 어셈블리가 표시될 수 있도록 InternalsVisibleToAttribute 특성을 shimmed 어셈블리 코드에 추가합니다.예를 들면 다음과 같습니다.

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

강력한 이름의 어셈블리에서 내부 형식

shim된 어셈블리가 강력하게 지명될 경우 및 어셈블리 내부 유형에 액세스하고자 하는 경우:

  • 테스트 어셈블리와 Fakes 어셈블리 모두 강력한 형식의 이름이어야 합니다.

  • shim 어셈블리의 InternalsVisibleToAttribute 특성에 테스트 공용 키와 Fakes 어셈블리를 추가해야 합니다.다음은 shim된 어셈블리가 강력하게 지명될 경우, shim된 어셈블리 코드의 샘플 속성이 어떻게 표시되는지를 설명합니다.

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

shim된 어셈블리가 강력하게 지명되는 경우 Fake 프레임워크는 생성된 Fake 어셈블리를 자동으로 강력하게 서명합니다.테스트 어셈블리에 강력하게 서명해야 합니다.강력한 이름의 어셈블리 만들기 및 사용를 참조하십시오.

Fakes 프레임워크는 동일한 키를 사용하여 생성된 모든 어셈블리를 서명합니다. 이 코드 조각을 시작점으로 사용하여 fakes 어셈블리의 InternalsVisibleTo 특성을 shimmed 어셈블리 코드에 추가할 수 있습니다.

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

.fakes 파일의 Fakes\Compilation 요소에 KeyFile 특성 값으로 대체 키가 포함된 .snk 파일에 대한 전체 경로를 지정하여 Fakes 어셈블리에 대해 다른 공용 키(예: shim 어셈블리에 대해 만든 키)를 지정할 수 있습니다.예를 들면 다음과 같습니다.

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

그런 다음 shim 어셈블리 코드의 Fakes 어셈블리에 대한 InternalVisibleTo 특성의 두 번째 매개 변수로 대체 .snk 파일의 공개 키를 사용해야 합니다.

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

위 예에서 Alternate_public_key 및 Test_assembly_public_key 값은 동일할 수 있습니다.

빌드 시간 최적화

Fake 어셈블리를 컴파일하면 빌드 시간이 크게 늘어날 수 있습니다..NET 시스템 어셈블리와 타사 어셈블리에 대한 Fakes 어셈블리를 별도의 중앙 프로젝트에 만들어 빌드 시간을 최소화할 수 있습니다.이러한 어셈블리는 컴퓨터에서 거의 바뀌지 않기 때문에 다른 프로젝트에서 생성된 Fake 어셈블리를 재사용할 수 있습니다.

단위 테스트 프로젝트에서 프로젝트 폴더의 FakesAssemblies 아래에 있는 컴파일된 Fake 어셈블리를 간단히 참조할 수 있습니다.

  1. 테스트 프로젝트와 일치하는 .NET 런타임 버전으로 새 클래스 라이브러리를 만듭니다.이제 Fakes.Prebuild를 호출해 보겠습니다.필요하지 않는 프로젝트에서 class1.cs 파일을 제거합니다.

  2. Fakes가 필요한 모든 시스템 및 타사 어셈블리에 대한 참조를 추가합니다.

  3. 각 어셈블리 및 빌드에 .fakes 파일을 추가합니다.

  4. 테스트 프로젝트에서

    • Fakes 런타임 DLL에 대한 참조가 있는지 확인하십시오.

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

    • 어셈블리에 필요한 Fake를 만드는 경우 프로젝트의 Fakes.Prebuild\FakesAssemblies 폴더에 있는 해당 DLL 파일에 참조를 추가합니다.

어셈블리 이름 충돌 방지

팀 빌드 환경에서 모든 빌드 출력은 단일 디렉터리로 병합됩니다.Fakes를 사용하는 여러 프로젝트의 경우 다른 버전의 Fakes 어셈블리들이 서로 재정의하는 상황이 발생할 수 있습니다.예를 들어 .NET Framework 4 용 .NET Framework 2.0 및 TestProject2 fakes mscorlib.dll의 TestProject1 fakes mscorlib.dll은 모두 mscorlib.Fakes.dll Fakes assembly로 바뀌게 됩니다.

이러한 문제가 발생하지 않도록 .fakes 파일을 추가할 때 비프로젝트 참조용 버전으로 한정된 Fakes 어셈블리 이름을 Fakes에서 자동으로 만들어야 합니다.Fakes 어셈블리 이름을 만들면 버전 한정 Fakes 어셈블리 이름이 버전 번호를 포함합니다.

MyAssembly 어셈블리 및 버전 1.2.3.4가 지정되면 Fake 어셈블리 이름은 MyAssembly.1.2.3.4.Fakes입니다.

.fakes에서 Assembly 요소의 Version 특성을 편집하여 이 버전을 변경하거나 제거할 수 있습니다.

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

Fakes 명명 규칙

shim 형식 및 스텁 형식 명명 규칙

네임스페이스

  • .Fakes 접미사가 네임스페이스에 추가됩니다.

    예를 들어 System.Fakes 네임스페이스에는 시스템 네임스페이스의 shim 형식이 포함되어 있습니다.

  • Global.Fakes에는 shim 형식의 빈 네임스페이스가 포함됩니다.

형식 이름

  • shim 접두사는 shim 형식 이름을 빌드하기 위해 형식 이름에 추가됩니다.

    예를 들어, ShimExample은 Example 형식의 shim 형식입니다.

  • 스텁 접두사는 스텁 형식 이름을 빌드하기 위해 형식 이름에 추가됩니다.

    예를 들어, StubIExample은 IExample 형식의 stub 형식입니다.

형식 인수 및 중첩 형식 구조체

  • 제네릭 형식 인수는 복사됩니다.

  • 중첩된 형식 구조가 심 형식에 대해 복사됩니다.

shim 대리자 속성 또는 스텁 대리자 필드 명명 규칙

필드 명명의 기본 규칙(빈 이름에서 시작):

  • 메서드 이름이 추가됩니다.

  • 메서드 이름이 명시적 인터페이스 구현인 경우 점이 제거됩니다.

  • 제네릭 메서드인 경우 Ofn는 n이 제네릭 메서드 인수의 수인 위치에 추가됩니다.

속성 getter 또는 setter와 같은 특정 메서드 이름은 다음 표에 설명 된 대로 처리됩니다.

메서드가 다음과 같은 경우

예제

추가된 메서드 이름

생성자

.ctor

Constructor

정적 생성자

.cctor

StaticConstructor

"_"로 구분된 두 부분으로 구성된 메서드 이름을 사용하는 접근자(예: 속성 getter)

kind_name(일반적인 경우지만 ECMA에 의해 강제로 적용 안 함)

NameKind, 두 부분 모두 대문자로 표시되고 대체되었음

속성 Prop의 Getter

PropGet

속성 Prop의 Setter

PropSet

이벤트 추가 기능

Add

이벤트 제거 기능

Remove

두 부분으로 구성된 연산자

op_name

NameOp

예: + 연산자

op_Add

AddOp

변환 연산자인 경우 반환 형식이 추가됩니다.

T op_Implicit

ImplicitOpT

참고

  • 인덱서의 Getter 및 setter는 속성과 비슷하게 처리됩니다.인덱서의 기본 이름은 Item입니다.

  • 매개 변수 형식 이름이 변환되고 연결됩니다.

  • 오버로드 모호성이 있지 않은 한 반환 형식이 무시됩니다.이 경우 반환 형식은 이름의 끝에 추가됩니다.

매개 변수 형식 명명 규칙

지정된

추가된 문자열은…

형식T

T

네임 스페이스, 중첩 구조체 및 제네릭 틱은 삭제됩니다.

out 매개 변수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에 추가됩니다.

재귀적 규칙

다음 규칙은 재귀적으로 적용됩니다.

  • Fake는 C#을 사용하여 Fake 어셈블리를 생성하기 때문에 잘못된 C# 토큰을 생성한 문자는 "_"(밑줄)로 이스케이프됩니다.

  • 결과 이름이 선언 형식의 모든 멤버와 충돌하는 경우 번호 매기기 스키마는 01에서 시작하여 2자리 카운터를 추가하여 사용됩니다.

외부 리소스

지침

Visual Studio 2012를 사용한 연속 배달 테스트 – 2장: 단위 테스트: 내부 테스트

참고 항목

개념

Microsoft Fakes를 사용하여 테스트 중인 코드 격리