Sdílet prostřednictvím


Vytváření, kompilace a konvence pojmenování kódu v Napodobeniny Microsoft

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

Generování a kompilace kódu

  • Konfigurace generování kódu zástupných procedur • Filtrování typu • Ukládání konkrétních tříd a virtuálních metod do zástupných procedur • Vnitřní typy • Optimalizace rychlosti sestavení • Předcházení kolizím názvů sestavení

Konvence pojmenovávání napodobenin

  • Konvence pojmenování typu překrytí a zástupného typu • Konvence pojmenování překrytí vlastnosti delegáta nebo pole zástupného delegáta • Konvence pojmenování typu parametru • Rekurzivní pravidla

Externí zdroje

  • Pokyny

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 prvku StubGeneration lze pro sestavení seznamu vybraných typů přidat libovolné množství prvků Vymazat, Přidat a Odebrat.

Například tento soubor FAKES generuje provizorní kód pro typy v oboru názvů System a System.IO, ale vynechá jakýkoli typ obsahující v názvu "Handle" z oboru názvů System:

<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 odpovídá "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! neodpovídá "hello"

    hello! odpovídá "hello"

  • Přidáním znaku * na konec filtrovacího řetězce se provede porovnání předpony řetězce:

    el* neodpovídá "hello"

    he* odpovídá "hello"

  • Vícero filtrovacích řetězců oddělených středníkem je vyhodnoceno jako disjunkce:

    el;wo odpovídá "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 zástupné 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>

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é.Chcete-li zviditelnit vnitřní typy překrytého sestavení pro falešné a testovací sestavení, přidejte atributy InternalsVisibleToAttribute do kódu překrytého sestavení, které dává viditelnost generovanému falešnému sestavení a testovacímu sestavení.Zde je příklad:

// FileSystem\AssemblyInfo.cs
[assembly: InternalsVisibleTo("FileSystem.Fakes")]
[assembly: InternalsVisibleTo("FileSystem.Tests")]

Vnitřní typy v sestaveních se silným názvem

Pokud je překryté sestavení pojmenováno silně a chcete přístup k vnitřním typům sestavení:

  • Zkušební sestava i falešné sestavení musí mít silné názvy.

  • Veřejné klíče testu a sestavy Fakes je třeba přidat do atributů InternalsVisibleToAttribute v překrytých sestaveních.Zde uvádíme, jak by vypadal náš příklad atributů v kódu překrytého sestavení, pokud je překryté sestavení silně pojmenováno:

    // FileSystem\AssemblyInfo.cs
    [assembly: InternalsVisibleTo("FileSystem.Fakes",
        PublicKey=<Fakes_assembly_public_key>)]
    [assembly: InternalsVisibleTo("FileSystem.Tests",
        PublicKey=<Test_assembly_public_key>)]
    

Jestliže je překryté sestavení pojmenováno silně, rámec falešného kódu automaticky silně podepíše vygenerované falešné sestavení.Musíte nastavit silný podpis testovacího sestavení.Viz téma Vytváření a používání sestavení se silným názvem.

Předstírá, že rozhraní používá stejný klíč k podepsání všech generovaných sestavení, takže tento fragment můžete použít jako výchozí bod přidat atributu InternalsVisibleTo pro falešné sestavení pro váš překrytý kód sestavení.

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

Můžete zadat jiný veřejný klíč pro sestavení Fakes, například klíč, který jste vytvořili pro překryté sestavení, zadáním úplné cesty k souboru .snk, který obsahuje alternativní klíč jako hodnotu atributu KeyFile v elementu Fakes\Compilation souboru .fakes.Příklad:

<-- FileSystem.Fakes.fakes -->
<Fakes ...>
  <Compilation KeyFile="full_path_to_the_alternate_snk_file" />
</Fakes>

Potom je nutné použít veřejný klíč náhradního souboru .snk jako druhý parametr atributu InternalVisibleTo pro sestavení Fakes v kódu shimmed sestavení:

// FileSystem\AssemblyInfo.cs
[assembly: InternalsVisibleTo("FileSystem.Fakes",
    PublicKey=<Alternate_public_key>)]
[assembly: InternalsVisibleTo("FileSystem.Tests",
    PublicKey=<Test_assembly_public_key>)]

V příkladu výše hodnoty Alternate_public_key a Test_assembly_public_key mohou být stejné.

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é napodobeniny 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é potřebujete napodobeniny.

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

  4. Ze zkušebního projektu

    • Ujistěte se, zda máte odkaz na napodobeninu knihovny runtime DLL:

      C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll

    • Pro každé sestavení, pro které jste vytvořili falešné sestavení, přidejte odkaz na odpovídající soubor knihovny DLL ve složce Fakes.Prebuild\FakesAssemblies k projektu.

Předcházet 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í budou vzájemně překrývat.Například projekt TestProject1 vyžaduje napodobeninu knihovny mscorlib.dll rozhraní .NET Framework 2.0 a projekt TestProject2 vyžaduje napodobeninu knihovny mscorlib.dll rozhraní .NET Framework 4, ale oba jsou přesměrovány na napodobeninu 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 sestavení Fakes odpovídající verzi přidají při vytvoření názvu sestavení Fakes čí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í napodobenin

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ů

  • Argumenty obecného 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í, počínaje 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řístupový objekt s názvem metody složeným ze dvou částí oddělených "_" (například gettery vlastností)

kind_name (běžný případ, ale nevynucený podle ECMA)

NameKind, kde obě části začínají velkými písmeny a jsou přehozeny

Getter vlastnosti Prop

PropGet

Setter vlastnosti Prop

PropSet

Přidavač 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

  • S 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ý typ je ignorován, 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ů

Daný

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

Typ ukazateleT*

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

N je připojeno, pak T

Rekurzivní pravidla

Následující pravidla jsou aplikována rekurzivně:

  • Jelikož napodobeniny používají pro generování napodobení sestavení jazyk C#, jakýkoli znak, který vyprodukuje neplatný token jazyka C# je převeden na "_" (podtržítko).

  • 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í částí: Testování uvnitř

Viz také

Koncepty

Izolace testovaného kódu pomocí zástupného rozhraní Microsoft