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 어셈블리를 간단히 참조할 수 있습니다.
테스트 프로젝트와 일치하는 .NET 런타임 버전으로 새 클래스 라이브러리를 만듭니다.이제 Fakes.Prebuild를 호출해 보겠습니다.필요하지 않는 프로젝트에서 class1.cs 파일을 제거합니다.
Fakes가 필요한 모든 시스템 및 타사 어셈블리에 대한 참조를 추가합니다.
각 어셈블리 및 빌드에 .fakes 파일을 추가합니다.
테스트 프로젝트에서
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장: 단위 테스트: 내부 테스트