Microsoft Fakes 中的代码生成、编译和命名约定
本主题介绍伪造品代码生成和生成讨论选项和问题,并描述伪造品生成的类型的命名约定,成员和参数。
要求
- Visual Studio 旗舰版
主题内容
这是可了解:
Code generation and compilation
代码生成和生成
存根配置的代码生成
存根生成委托类型在具有 .fakes 文件扩展名的 XML 文件配置。 结构在生成集成的伪造品通过自定义 MSBuild 任务处理以及检测这些文件在编译时。 伪造品代码生成器生成存根类型为程序集并将引用添加到项目中。
下面的示例演示了 FileSystem.dll 定义的存根 (stub) 类型:
<Fakes xmlns="https://schemas.microsoft.com/fakes/2011/">
<Assembly Name="FileSystem"/>
</Fakes>
键入筛选
针对 .fakes 文件中设置限制应碰哪些类型。 可以将一个无限制的数字清除,添加,移除元素在 StubGeneration 元素下生成所选的类型的列表。
例如,此 .fakes 文件生成类型的存根。系统和 System.IO 命名空间下,但是,排除包含“handles”的任何类型系统中:
<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>
内部类型
伪造品代码生成器将生成填充类型和 stub 类型是可见的。生成的伪造品程序集中的类型的。 若要使内部类型可见可以添加 InternalsVisibleTo 属性设置范围可见性生成的伪造品集的加载填的程序集。
[assembly: InternalsVisibleTo("FileSystem.Fakes")]
如果将填的程序集指定强签名,伪造品框架将强签名自动生成的伪造品程序集。 在这种情况下,InternalsVisibleToAttribute 属性需要引用程序集名称和公钥。 伪造品结构始终使用相同的密钥对程序集签名,因此,可以使用此代码段,作为起点 InternalsVisibleTo 属性添加到项目中。
[assembly: InternalsVisibleTo("FileSystem.Fakes, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc")]
优化编译时
伪造品程序集的编译可以极大地提高编译时。 通过生成伪造品程序集减少生成时间的 .NET 系统程序集和第三方程序集在单独的聚焦项。 由于这种程序集在您的计算机很少更改,则可以重用在其他项目中生成的伪造品程序集。
从将单元测试项目,可以接受对放在 FakesAssemblies 下在项目文件夹中的生成伪造品程序集。
创建具有 .NET 运行时版本匹配的库测试项目的新选件类。 我们称之为 Fakes.Prebuild。 从项目中删除 class1.cs 文件,不需要。
添加对需要伪造品的所有系统和第三方程序集。
添加每个的一 .fakes 文件程序集并生成。
从测试项目中,添加程序集引用并浏览到 Fakes.Prebuild\FakesAssemblies 文件夹并查找相应的程序集。
避免程序集名称冲突
在 Team Build 环境中,所有生成输出合并到一个目录中。 对于使用伪造品的多个项目,则可能发生不同版本的伪造品程序集进行重写。 例如,TestProject1 伪造品从 .NET Framework 2.0 和 TestProject2 伪造品 .NET framework 4 的 mscorlib.dll 的 mscorlib.dll 都提供对 mscorlib.Fakes.dll 伪造品程序集。
若要避免此问题,请伪造品应自动创建版本名称非项目引用,将添加 .fakes 文件时的限定伪造品程序集。 在创建伪造品程序集时,一个版本限定伪造品程序集名称中嵌入一个版本号:
给出程序集 MyAssembly 和版本 1.2.3.4,伪造品程序集名称是 MyAssembly.1.2.3.4.Fakes。
可以通过编辑 assembly 元素的版本属性更改或移除此版本在该 .fakes 的:
attribute of the Assembly element in the .fakes:
<Fakes ...>
<Assembly Name="MyAssembly" Version="1.2.3.4" />
...
</Fakes>
程序集命名约定
填充类型和 stub 键入命名约定
命名空间
. 伪造品后缀添加到命名空间。
例如,System.Fakes 命名空间包含 system 命名空间的填充类型。
Global.Fakes 包含该空命名空间的填充类型。
类型名称
填充前缀将添加到类型名称生成填充类型名称。
例如,ShimExample 是示例类型的填充类型。
存根前缀将添加到类型名称生成存根类型名称。
例如,StubIExample 是 IExample 类型的存根 (stub) 类型。
类型参数和嵌套类型结构
泛型类型参数被复制。
嵌套类型 framework 为填充类型被复制。
填充委托属性或短线委托字段命名约定
字段名的基本规则,从空的名称开头:
方法名称追加。
如果方法名称是显式接口实现,移除点。
如果方法是泛型的,Ofn 追加 n 是泛型方法参数的位置数。
特殊方法名称 例如属性 getter 或 setter 将如下表所述。
如果方法是… |
示例 |
追加的方法名称 |
---|---|---|
构造函数 |
.ctor |
Constructor |
静态 构造函数 |
.cctor |
StaticConstructor |
使用方法名称的 访问器 组成由两部分由“_”分隔 (例如属性 getter) |
kind_name (通常情况下,使用,但不强制执行 ECMA) |
NameKind,两个部件大写并交换 |
属性 Propgetter |
PropGet |
|
属性 Prop的 setter |
PropSet |
|
事件 adder |
Add |
|
事件去膜剂 |
Remove |
|
运算符 由两部分组成 |
op_name |
NameOp |
例如:+ 运算符 |
op_Add |
AddOp |
对于 转换运算符,返回类型追加。 |
T op_Implicit |
ImplicitOpT |
注释
索引器的 getter 和 setter 处理方式类似于属性。 默认名称是索引器 Item。
参数类型 名称转换并连接。
除非具有超加载多义性,返回类型 被忽略。 如果是这样,返回类型追加在名称末尾
参数类型命名约定
命名 |
追加的字符串是… |
---|---|
类型 T |
T 命名空间、嵌套结构和泛 tics 放置。 |
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 |
递归规则
以递归方式将以下规则:
由于伪造品使用 C# 生成伪造品程序集,会生成一个无效的 c# 标记的所有字符转义为“_”(下划线)。
如果一个结果的名称与该声明类型的任何成员发生冲突,追加一个计数器使用数字模式,从 01 开始。
外部资源
指南
测试使用 Visual Studio 进行附带的 2012 版–第 2 章:单元测试:测试。