Sdílet prostřednictvím


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

Fakes Naming Conventions

Generování a kompilace kódu

Hh708916.collapse_all(cs-cz,VS.110).gifKonfigurace 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>

Hh708916.collapse_all(cs-cz,VS.110).gifFiltrová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"

Hh708916.collapse_all(cs-cz,VS.110).gifVytvář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>

Hh708916.collapse_all(cs-cz,VS.110).gifPodepisová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>

Hh708916.collapse_all(cs-cz,VS.110).gifVnitř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")]

Hh708916.collapse_all(cs-cz,VS.110).gifOptimalizace 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.

  1. 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í.

  2. 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.

  3. Do každého z těchto sestavení přidejte soubor s příponou .fakes a sestavení sestavte.

  4. V testovacím projektu přidejte referenci na sestavení a v adresáři Fakes.Prebuild\FakesAssemblies vyhledejte odpovídající sestavení.

Hh708916.collapse_all(cs-cz,VS.110).gifVyvarová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

Hh708916.collapse_all(cs-cz,VS.110).gifKonvence 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.

Hh708916.collapse_all(cs-cz,VS.110).gifKonvence 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.

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.

Hh708916.collapse_all(cs-cz,VS.110).gifKonvence 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

Hh708916.collapse_all(cs-cz,VS.110).gifRekurzivní 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

Hh708916.collapse_all(cs-cz,VS.110).gifPokyny

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