Microsoft Fakes 中的代码生成、编译和命名约定

本主题介绍伪造品代码生成和生成讨论选项和问题,并描述伪造品生成的类型的命名约定,成员和参数。

要求

  • Visual Studio 旗舰版

主题内容

这是可了解:

Code generation and compilation

Fakes Naming Conventions

代码生成和生成

Hh708916.collapse_all(zh-cn,VS.110).gif存根配置的代码生成

存根生成委托类型在具有 .fakes 文件扩展名的 XML 文件配置。 结构在生成集成的伪造品通过自定义 MSBuild 任务处理以及检测这些文件在编译时。 伪造品代码生成器生成存根类型为程序集并将引用添加到项目中。

下面的示例演示了 FileSystem.dll 定义的存根 (stub) 类型:

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

Hh708916.collapse_all(zh-cn,VS.110).gif键入筛选

针对 .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”

Hh708916.collapse_all(zh-cn,VS.110).gif碰的具体选件类和虚方法

默认情况下,存根类型为所有非密封选件类生成。 为抽象类限制存根类型通过 .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>

Hh708916.collapse_all(zh-cn,VS.110).gif强名称签名

当填的程序集指定强签名,伪造品框架将自动对生成的伪造品程序集。 除非用户指定不同的密钥对程序集进行签名,伪造品结构始终使用相同的密钥。 不同的键。.fakes 文件中指定。

<Fakes ...>
  <Compilation KeyFile="path to the key file" />
</Fakes>

Hh708916.collapse_all(zh-cn,VS.110).gif内部类型

伪造品代码生成器将生成填充类型和 stub 类型是可见的。生成的伪造品程序集中的类型的。 若要使内部类型可见可以添加 InternalsVisibleTo 属性设置范围可见性生成的伪造品集的加载填的程序集。

[assembly: InternalsVisibleTo("FileSystem.Fakes")]

如果将填的程序集指定强签名,伪造品框架将强签名自动生成的伪造品程序集。 在这种情况下,InternalsVisibleToAttribute 属性需要引用程序集名称和公钥。 伪造品结构始终使用相同的密钥对程序集签名,因此,可以使用此代码段,作为起点 InternalsVisibleTo 属性添加到项目中。

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

Hh708916.collapse_all(zh-cn,VS.110).gif优化编译时

伪造品程序集的编译可以极大地提高编译时。 通过生成伪造品程序集减少生成时间的 .NET 系统程序集和第三方程序集在单独的聚焦项。 由于这种程序集在您的计算机很少更改,则可以重用在其他项目中生成的伪造品程序集。

从将单元测试项目,可以接受对放在 FakesAssemblies 下在项目文件夹中的生成伪造品程序集。

  1. 创建具有 .NET 运行时版本匹配的库测试项目的新选件类。 我们称之为 Fakes.Prebuild。 从项目中删除 class1.cs 文件,不需要。

  2. 添加对需要伪造品的所有系统和第三方程序集。

  3. 添加每个的一 .fakes 文件程序集并生成。

  4. 从测试项目中,添加程序集引用并浏览到 Fakes.Prebuild\FakesAssemblies 文件夹并查找相应的程序集。

Hh708916.collapse_all(zh-cn,VS.110).gif避免程序集名称冲突

在 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>

程序集命名约定

Hh708916.collapse_all(zh-cn,VS.110).gif填充类型和 stub 键入命名约定

命名空间

  • . 伪造品后缀添加到命名空间。

    例如,System.Fakes 命名空间包含 system 命名空间的填充类型。

  • Global.Fakes 包含该空命名空间的填充类型。

类型名称

  • 填充前缀将添加到类型名称生成填充类型名称。

    例如,ShimExample 是示例类型的填充类型。

  • 存根前缀将添加到类型名称生成存根类型名称。

    例如,StubIExample 是 IExample 类型的存根 (stub) 类型。

类型参数和嵌套类型结构

  • 泛型类型参数被复制。

  • 嵌套类型 framework 为填充类型被复制。

Hh708916.collapse_all(zh-cn,VS.110).gif填充委托属性或短线委托字段命名约定

字段名的基本规则,从空的名称开头:

  • 方法名称追加。

  • 如果方法名称是显式接口实现,移除点。

  • 如果方法是泛型的,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。

  • 参数类型 名称转换并连接。

  • 除非具有超加载多义性,返回类型 被忽略。 如果是这样,返回类型追加在名称末尾

Hh708916.collapse_all(zh-cn,VS.110).gif参数类型命名约定

命名

追加的字符串是…

类型 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

Hh708916.collapse_all(zh-cn,VS.110).gif递归规则

以递归方式将以下规则:

  • 由于伪造品使用 C# 生成伪造品程序集,会生成一个无效的 c# 标记的所有字符转义为“_”(下划线)。

  • 如果一个结果的名称与该声明类型的任何成员发生冲突,追加一个计数器使用数字模式,从 01 开始。

外部资源

Hh708916.collapse_all(zh-cn,VS.110).gif指南

测试使用 Visual Studio 进行附带的 2012 版–第 2 章:单元测试:测试。

请参见

概念

用 Microsoft Fakes 隔离测试代码