Microsoft Fakes 中的程式碼產生、編譯和命名慣例
本主題說明如何選取,並在偽造的產品問題的程式碼產生和編譯,並描述偽造的範例會產生型別的命名慣例,成員和參數。
需求
- Visual Studio Ultimate
本主題內容
以下是您可以了解:
Code generation and compilation
程式碼產生和編譯
Stub 的配置產生程式碼
Stub 型別會在有 .fakes 副檔名的 XML 檔中設定產生。 偽造範例框架中建置流程整合傳遞自訂 MSBuild 工作並在建置時間偵測這些檔案。 偽造範例程式碼產生器編譯 Stub 型別至組件並加入至專案參考。
下列範例說明在 FileSystem.dll 定義的 Stub 型別:
<Fakes xmlns="https://schemas.microsoft.com/fakes/2011/">
<Assembly Name="FileSystem"/>
</Fakes>
輸入篩選
篩選條件在 .fakes 檔案可以設定去限制應該 Stub 哪些型別。 您可以加入清除的未繫結數目、加入、移除,StubGeneration 項目之下建立選取的類型清單。
例如,這 .fakes 檔案產生型別的 Stub 在系統和 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」
Stub 的特定類別的和虛擬方法
根據預設,為任何非密封類別產生Stub 型別。 為抽象類別限制 Stub 型別傳遞 .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>
內部型別
偽造範例程式碼產生器會對偽造範例組件產生 Shim 和 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 的 mscorlib.dll 和 TestProject2 偽造的 .NET Framework 4 的 mscorlib.dll 兩個會讓給 mscorlib.Fakes.dll 偽造的組件。
若要避免這個問題,當加入這個 .fakes 檔時,偽造範例應該自動建立版本為非專案參考限定偽造範例組件名稱。 然後,當您建立偽造範例組件名稱時,便會將版本限定的偽造範例組件名稱嵌入版本號碼:
給定組件 MyAssembly 和版本 1.2.3.4,偽造的組件名稱為 MyAssembly.1.2.3.4.Fakes。
您可以透過編輯在 .fakes中的組件項目版本屬性變更或移除這個版本:
attribute of the Assembly element in the .fakes:
<Fakes ...>
<Assembly Name="MyAssembly" Version="1.2.3.4" />
...
</Fakes>
偽造命名慣例
Shim 型別和 Stub 輸入命名慣例
命名空間
. 偽造的後置字元加入至命名空間。
例如, System.Fakes 命名空間包含系統命名空間的 Shim 型別。
Global.Fakes 包含空命名空間的 Shim 型別。
型別名稱
Shim 前置詞加入至型別名稱去建立 Shim 型別名稱。
例如, ShimExample 範例是型別的 Shim 型別。
Stub 前置詞加入至型別名稱去建立 Stub 型別名稱。
例如, StubIExample 是 IExample 型別的 Stub 型別。
型別引數和巢狀型別結構
泛型型別引數被複製。
巢狀型別結構為 Shim 型別而被複製。
填入屬性 Stub 委派或委派欄位命名慣例
欄位名稱的基本規則。 ,從空白名稱開頭:
方法名稱被附上。
如果方法名稱是明確的介面實作,點會被移除。
如果方法為泛型, 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 命名空間 (Namespace)、巢狀結構和泛型 tics 深度會被丟棄。 |
外部參數 out T |
TOut |
參考參數 ref T |
TRef |
陣列型別 T[] |
TArray |
多維陣列型別T[ , , ]。 |
T3 |
指標 型別 T* |
TPtr |
泛型型別 T<R1, …> |
TOfR1 |
泛型型別參數 !i 在型別中C<TType> |
Ti |
泛型型別參數 !!i在方法中M<MMethod> |
Mi |
巢型型別 N.T |
N 被附加,然後 T |
遞迴規則
下列規則遞迴套用:
由於 Fakes 使用 C# 產生 Fakes 組件,會產生一個無效的 C# 語彙基元的所有字元逸出為「_」(底線)。
如果所產生的名稱與宣告型別與任何成員發生衝突,附加一位數計數器使用編號配置,從 01 開始。
外部資源
指引
測試以搭配使用 Visual Studio 2012RC–第 2 章:單元測試:內部測試