Generování kódu, kompilaci a konvence v Microsoft předstírá
Toto téma popisuje možnosti a problémy při generování a kompilaci falešného kódu a popisuje konvence pro pojmenovávání falešných generovaných typů, členů a parametrů.
Požadavky
- Visual Studio Ultimate
V tomto tématu
Zde se můžete dozvědět:
Code generation and compilation
Generování a kompilace kódu
Konfigurace generování provizorního kódu
Generování provizorních typů lze nastavit v XML souboru s příponou .fakes.Rámec falešného kódu je integrován do procesu sestavení prostřednictvím úkolů MSBuild a tyto soubory detekuje během sestavení.Generátor falešného kódu kompiluje provizorní typy do sestavení a přidává reference na projekt.
Následující příklad ilustruje provizorní typy definované v knihovně FileSystem.dll:
<Fakes xmlns="https://schemas.microsoft.com/fakes/2011/">
<Assembly Name="FileSystem"/>
</Fakes>
Filtrování typů
Filtry mohou být pro omezení typů, pro které má být vytvořen provizorní kód, nastaveny v souboru s příponou .fakes.Do elementu StubGeneration lze pro sestavení seznamu vybraných typů přidat libovolné množství elementů Clear, Add a Remove.
Například tento soubor .fakes generuje kódy pro typy v oborech názvů systému a System.IO, ale vylučuje jakýkoli typ obsahující "Zpracování" v systému:
<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>
Řetězce filtru používají k definování shody jednoduchou gramatiku:
Filtry ve výchozím nastavení rozlišují malá a velká písmena; filtry provádějí porovnání podřetězců:
el nalezne "hello"
Přidáním znaku ! na konec filtrovacího řetězce se provede přesné porovnání rozlišující i malá a velká písmena:
el! nenalezne "hello"
hello! nalezne "hello"
Přidáním znaku * na konec filtrovacího řetězce se provede porovnání předpony řetězce:
el* nenalezne "hello"
he* nalezne "hello"
Vícero filtrovacích řetězců oddělených středníkem je vyhodnoceno jako disjunkce:
el;woPorovná "řetězec hello" a "world"
Vytváření provizorního kódu konkrétních tříd a virtuálních metod
Ve výchozím nastavení jsou provizorní typy generovány pro všechny nezapečetěné třídy.Generování provizorních typů lze prostřednictvím konfiguračního souboru FAKES omezit pouze pro abstraktní třídy:
<Fakes xmlns="https://schemas.microsoft.com/fakes/2011/">
<Assembly Name="mscorlib" />
<!-- user code -->
<StubGeneration>
<Types>
<Clear />
<Add AbstractClasses="true"/>
</Types>
</StubGeneration>
<!-- /user code -->
</Fakes>
Podepisování silným názvem
Rámec falešného kódu bude automaticky podepisovat sestavení falešného kódu, jestliže je překrývané sestavení podepsáno silným názvem.Rámec falešného kódu bude vždy používat stejný klíč, ledaže by uživatel pro podpis sestavení specifikoval jiný klíč.Jiný klíč lze zadat v souboru FAKES.
<Fakes ...>
<Compilation KeyFile="path to the key file" />
</Fakes>
Vnitřní typy
Generátor falešného kódu bude generovat překrývající a provizorní typy, které jsou pro falešné sestavení viditelné.Pro zviditelnění vnitřních typů lze do překrytého sestavení přidat atribut InternalsVisibleTo, který přidá vygenerovanému falešnému sestavení viditelnost.
[assembly: InternalsVisibleTo("FileSystem.Fakes")]
Jestliže je překryté sestavení podepsáno silně, rámec falešného kódu automaticky silně podepíše vygenerované falešné sestavení.V takovém případě atribut InternalsVisibleToAttribute musí odkazovat na název sestavení, jakož i veřejný klíč.Rámec falešného kódu pro podepisování sestavení používá vždy stejný klíč, takže lze jako výchozí bod pro přidání atributu InternalsVisibleTo do projektu použít fragment.
[assembly: InternalsVisibleTo("FileSystem.Fakes, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e92decb949446f688ab9f6973436c535bf50acd1fd580495aae3f875aa4e4f663ca77908c63b7f0996977cb98fcfdb35e05aa2c842002703cad835473caac5ef14107e3a7fae01120a96558785f48319f66daabc862872b2c53f5ac11fa335c0165e202b4c011334c7bc8f4c4e570cf255190f4e3e2cbc9137ca57cb687947bc")]
Optimalizace doby sestavení
Kompilace falešných sestavení může podstatně prodloužit dobu sestavení.Dobu sestavení lze minimalizovat generováním falešných sestavení pro systémová sestavení technologie .NET a sestavení třetích stran v odděleném centralizovaném projektu.Jelikož se takováto sestavení na počítači mění zřídka, lze tyto vygenerovaná falešná sestavení opětovně použít v dalších projektech.
V projektech jednotkových testů lze jednoduše odkazovat na kompilovaná falešná sestavení, která jsou umístěna v podadresáři FakesAssemblies adresáře projektu.
Vytvořte novou knihovnu tříd s verzí modulu runtime technologie .NET odpovídající testovacímu projektu.Nazvěte ji třeba Fakes.Prebuild.Z projektu odstraňte soubor class1.cs, který není zapotřebí.
Přidejte referenci na všechna systémová sestavení a sestavení třetích stran, pro které mají být falešné třídy určeny.
Do každého z těchto sestavení přidejte soubor s příponou .fakes a sestavení sestavte.
V testovacím projektu přidejte referenci na sestavení a v adresáři Fakes.Prebuild\FakesAssemblies vyhledejte odpovídající sestavení.
Vyvarování se kolizi názvů sestavení
V prostředí Team Build jsou všechna výstupní sestavení sloučena do jednoho adresáře.V případě, že více projektů používá falešné třídy, může se stát, že se falešná sestavení z rozdílných verzích budou vzájemně překrývat.Například projekt TestProject1 vyžaduje falešné sestavení knihovny mscorlib.dll technologie .NET Framework 2.0 a projekt TestProject2 vyžaduje falešné sestavení knihovny mscorlib.dll technologie .NET Framework 4, ale oba jsou přesměrovány na falešné sestavení mscorlib.Fakes.dll.
Pro vyvarování se tomuto problému by měl rámec při přidávání souborů .fakes automaticky generovat pro reference mimo projekt názvy falešných sestavení odpovídající verzi.Názvy falešných sestavení odpovídající verzi přidají při vytvoření názvu falešného sestavení číslo verze:
Pro sestavení MyAssembly a verzi 1.2.3.4 se bude falešné sestavení nazývat MyAssembly.1.2.3.4.Fakes.
Tuto verzi lze odstranit nebo změnit úpravou atributu Version prvku Assembly v souboru .fakes:
attribute of the Assembly element in the .fakes:
<Fakes ...>
<Assembly Name="MyAssembly" Version="1.2.3.4" />
...
</Fakes>
Konvence pojmenovávání falešného kódu
Konvence pojmenovávání překrývajících a provizorních typů
Obory názvů
Oboru názvů je přidána přípona .fakes.
Například obor názvů System.Fakes obsahuje typy překrytí oboru názvu System.
Soubor Global.Fakes obsahuje překrývající typ prázdného oboru názvů.
Názvy typu
Názvu typu je pro vytvoření názvu překrývajícího typu přidána předpona Shim.
Například typ ShimExample je překrývající typ typu Example.
Názvu typu je pro vytvoření názvu provizorního typu přidána předpona Stub.
Například typ StubIExample je provizorním typem typu IExample
Argumenty typů a vnořené struktury typů
Obecné argumenty typu jsou zkopírovány.
Pro překrývající typy jsou vnořené struktury typů zkopírovány.
Konvence pojmenování vlastností překrývajícího delegáta a polí provizorního delegáta
Základní pravidla pro pojmenovávání polí, začíná se prázdným názvem:
Je připojen název metody.
Jestliže je název metody explicitní implementací rozhraní, jsou odstraněny tečky.
Jestliže se jedná o obecnou metodu, je připojeno Ofn, kde n znamená počet argumentů metody.
S názvy speciálních metod jako jsou gettery nebo settery je zacházeno podle následující tabulky.
Pokud je metoda... |
Příklad |
Připojený název metody |
---|---|---|
Konstruktor |
.ctor |
Constructor |
Statický konstruktor |
.cctor |
StaticConstructor |
Přistupující objekt metodou název se skládá ze dvou částí oddělených "_" (jako je například vlastnost mechanismy získání) |
typ_název (běžný případ, ale nevynucený podle ECMA) |
NázevTyp, kde obě části začínají velkými písmeny a jsou přehozeny |
Getter vlastnosti Prop |
PropGet |
|
Setter vlastnosti Prop |
PropSet |
|
Přidávač událostí |
Add |
|
Odstraňovač událostí |
Remove |
|
Operátor složený ze dvou částí |
op_name |
NameOp |
Například: operátor + |
op_Add |
AddOp |
Pro operátor konverze je připojen návratový typ. |
T op_Implicit |
ImplicitOpT |
Poznámky
Se gettery a settery indexerů je zacházeno podobně jako s vlastnostmi.Výchozí název indexeru je Item.
Názvy typů parametrů jsou transformovány a spojeny.
Návratové typy jsou ignorovány, ledaže by existovala dvojznačnost přetížení.V takovém případě je návratový typ přidán na konec názvu.
Konvence pojmenovávání parametrických typů
Typ parametru |
Připojený řetězec je... |
---|---|
TypT |
T Obory názvů, vnořené struktury a obecné tiky jsou vynechány. |
Výstupní parametrout T |
TOut |
Parametr refref T |
TRef |
Typ poleT[] |
TArray |
Typ vícerozměrné poleT[ , , ] |
T3 |
UkazatelT* |
TPtr |
Obecný typT<R1, …> |
TOfR1 |
Argument obecného typu!i typu C<TType> |
Ti |
Argument obecné metody!!i metody M<MMethod> |
Mi |
Vnořený typN.T |
Je připojeno N a následně T |
Rekurzivní pravidla
Následující pravidla jsou aplikována rekurzivně:
Protože předstírá používá C# pro generování sestavení předstírá, libovolný znak, který vytvoří neplatný token C# uvozeny k "_" (znak podtržení).
Jestliže výsledný název koliduje se členem deklarovaného typu, je přidáním dvou číselného čítače (začínajícího od 01) aplikováno číselné schéma.
Externí zdroje
Pokyny
Testování pro nepřetržité dodávky s Visual Studio 2012 – kapitola 2: testování: testování vnitřní
Viz také
Koncepty
Izolace testovaného kódu pomocí zástupného rozhraní Microsoft