Sdílet prostřednictvím


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

Tento článek popisuje možnosti a problémy v generování a kompilaci kódu Fakes a popisuje konvence vytváření názvů pro typy, členy a parametry generované fakes.

Požadavky

  • Visual Studio Enterprise

  • Projekt rozhraní .NET Framework

  • Podpora projektů ve stylu .NET Core, .NET 5.0 nebo novější a verze SDK ve verzi Preview v sadě Visual Studio 2019 Update 6 a je ve výchozím nastavení povolená v aktualizaci Update 8. Další informace naleznete v tématu Microsoft Fakes for .NET Core and SDK-style projects.

Generování a kompilace kódu

Konfigurace generování kódu zástupných procedur

Generování typů zástupných procedur je nakonfigurováno v souboru XML, který má příponu souboru .fakes . Architektura Fakes se integruje do procesu sestavení prostřednictvím vlastních úloh NÁSTROJE MSBuild a detekuje tyto soubory v době sestavení. Generátor kódu Fakes zkompiluje typy zástupných procedur do sestavení a přidá odkaz na projekt.

Následující příklad ukazuje typy zástupných procedur definované v FileSystem.dll:

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

Filtrování typů

Filtry lze nastavit v souboru .fakes tak, aby se omezily typy, které by se měly zakrývat. Do elementu StubGeneration můžete přidat nevázaný počet prvků Clear, Add, Remove a sestavit seznam vybraných typů.

Například následující soubor .fakes generuje zástupné procedury pro typy v rámci systému a System.IO obory názvů, ale vylučuje jakýkoli typ obsahující "Popisovač" v systému:

<Fakes xmlns="http://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í jednoduchou gramatiku k definování způsobu, jakým se má shodovat:

  • Filtry ve výchozím nastavení nerozlišují malá a velká písmena; filtry provádějí porovnávání podřetěžce:

    el odpovídá "hello"

  • Přidáním ! na konec filtru je přesná shoda s rozlišováním velkých a malých písmen:

    el! neodpovídá "hello"

    hello! odpovídá "hello"

  • Když * přidáte na konec filtru, bude odpovídat předponě řetězce:

    el* neodpovídá "hello"

    he* odpovídá "hello"

  • Více filtrů v seznamu odděleném středníkem se zkombinuje jako disjunkce:

    el;wo odpovídá "hello" a "world"

Konkrétní třídy zástupných procedur a virtuální metody

Ve výchozím nastavení se typy zástupných procedur generují pro všechny nezapečetěné třídy. Typy zástupných procedur je možné omezit na abstrakci tříd prostřednictvím konfiguračního souboru .fakes :

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" />
  <!-- user code -->
  <StubGeneration>
    <Types>
      <Clear />
      <Add AbstractClasses="true"/>
    </Types>
  </StubGeneration>
  <!-- /user code -->
</Fakes>

Interní typy

Generátor kódu Fakes generuje typy shim a typy zástupných procedur pro typy, které jsou viditelné pro vygenerované sestavení Fakes. Chcete-li, aby byly interní typy převráceného sestavení viditelné pro Fakes a testovací sestavení, přidejte InternalsVisibleToAttribute atributy do kódu převráceného sestavení, který poskytuje viditelnost generovaného sestavení Fakes a testovací sestavení. Tady je příklad:

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

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

Pokud je přesunutá sestavení silně pojmenovaná a chcete získat přístup k interním typům sestavení:

  • Testovací sestavení i sestavení Fakes musí být silně pojmenovány.

  • Přidejte veřejné klíče sestavení test a Fakes do atributů InternalsVisibleToAttribute v shimmed sestavení. Tady je postup, jak by atributy příkladu v kódu sestavení shimmed vypadaly, když je přešikované sestavení silně pojmenované:

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

Pokud je převrácené sestavení silně pojmenované, architektura Fakes automaticky podepíše vygenerované falešné sestavení. Musíte podepsat testovací sestavení. Viz sestavení se silným názvem.

Architektura Fakes používá stejný klíč k podepsání všech vygenerovaných sestavení, takže tento fragment kódu můžete použít jako výchozí bod pro přidání atributu InternalsVisibleTo pro sestavení fakes do kódu sestavení shimmed.

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

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

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

Pak musíte použít veřejný klíč alternativního souboru .snk jako druhý parametr atributu InternalVisibleTo pro sestavení Fakes v kódu sestavení shimmed:

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

V předchozím příkladu můžou být hodnoty Alternate_public_key a hodnoty Test_assembly_public_key stejné.

Optimalizace časů sestavení

Kompilace sestavení Fakes může výrazně zvýšit dobu sestavení. Čas sestavení můžete minimalizovat tak, že vygenerujete sestavení Fakes pro sestavení systému .NET a sestavení třetích stran v samostatném centralizovaném projektu. Vzhledem k tomu, že se taková sestavení zřídka mění na vašem počítači, můžete znovu použít vygenerovaná sestavení Fakes v jiných projektech.

Z projektů testů jednotek přidejte odkaz na zkompilovaná sestavení Fakes, která jsou umístěna pod FakesAssemblies ve složce projektu.

  1. Vytvořte novou knihovnu tříd s verzí modulu runtime .NET odpovídající vašim testovacím projektům. Pojmenujme ho Fakes.Prebuild. Odeberte soubor class1.cs z projektu, který není potřeba.

  2. Přidejte odkaz na všechna sestavení systému a třetích stran, pro která potřebujete Fakes.

  3. Přidejte soubor .fakes pro každé sestavení a sestavení.

  4. Z testovacího projektu

    • Ujistěte se, že máte odkaz na knihovnu DLL modulu runtime Fakes:

      %ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll

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

Vyhněte se kolidování názvů sestavení

V prostředí týmového sestavení se všechny výstupy sestavení sloučí do jednoho adresáře. Pokud více projektů používá Fakes, může se stát, že fakes sestavení z různých verzí přepíší navzájem. Například fakes TestProject1 mscorlib.dll z rozhraní .NET Framework 2.0 a TestProject2 falešné mscorlib.dll pro rozhraní .NET Framework 4 by oba přinesly mscorlib. Fakes.dll sestavení Fakes.

Aby se zabránilo tomuto problému, fakes by při přidávání souborů .fakes automaticky vytvořily kvalifikované názvy sestavení Fakes pro neprojektové odkazy . Název sestavení Fakes s kvalifikovanými verzemi vloží číslo verze při vytváření názvu sestavení Fakes:

Vzhledem k sestavení MyAssembly a verzi 1.2.3.4 je název sestavení Fakes MyAssembly.1.2.3.4.Fakes.

Tuto verzi můžete změnit nebo odebrat úpravou atributu Version elementu Assembly v .fakes:

attribute of the Assembly element in the .fakes:
<Fakes ...>
  <Assembly Name="MyAssembly" Version="1.2.3.4" />
  ...
</Fakes>

Konvence vytváření názvů fakes

Konvence pojmenování typu shim a zástupných procedur

Obory názvů

  • . Do oboru názvů se přidá přípona Fakes.

    Obor názvů například System.Fakes obsahuje typy přešikování systémového oboru názvů.

  • Global.Fakes obsahuje typ shim prázdného oboru názvů.

    Názvy typů

  • Předpona shim se přidá do názvu typu pro sestavení názvu typu shim.

    ShimExample je například typ shim typu Příklad.

  • Předpona zástupných procedur se přidá do názvu typu, aby se vytvořil název typu zástupných procedur.

    Například StubIExample je typ zástupných procedur typu IExample.

    Argumenty typů a vnořené struktury typů

  • Zkopírují se argumenty obecného typu.

  • Vnořená struktura typů se zkopíruje pro typy přechádění.

Vlastnosti delegáta shim nebo konvence pojmenování polí delegáta zástupných procedur

Základní pravidla pro pojmenování polí počínaje prázdným názvem:

  • Název metody je připojen.

  • Pokud je název metody explicitní implementací rozhraní, tečky se odeberou.

  • Pokud je metoda obecná, Ofn je připojena, kde n je počet argumentů obecné metody.

    Speciální názvy metod, jako je getter nebo setter, se považují za popisované v následující tabulce:

Pokud je metoda... Příklad Připojený název metody
Konstruktor .ctor Constructor
Statický konstruktor .cctor StaticConstructor
Přístup s názvem metody složený ze dvou částí oddělených znakem _(například getters vlastností) kind_name (běžný případ, ale nevynucuje ECMA) NameKind, kde byly obě části velkými písmeny a prohozeny
Getter of property Prop PropGet
Setter vlastnosti Prop PropSet
Doplněk událostí Add
Odebrání událostí Remove
Operátor složený ze dvou částí op_name NameOp
Příklad: + operátor op_Add AddOp
U operátoru převodu je návratový typ připojen. T op_Implicit ImplicitOpT

Poznámka:

  • Funkce Getters a setter indexerů se zpracovávají podobně jako u vlastnosti. Výchozí název indexeru je Item.
  • Názvy typů parametrů se transformují a zřetězeny.
  • Návratový typ je ignorován, pokud neexistuje nejednoznačnost přetížení. Pokud existuje nejednoznačnost přetížení, návratový typ se připojí na konec názvu.

Konvence pojmenování typu parametru

Daný Připojený řetězec je...
Typ T T

Obor názvů, vnořená struktura a obecná tika se zahodí.
Out parametrout T TOut
Parametr odkazu ref T TRef
Typ poleT[] TArray
Multidimenzionální typ poleT[ , , ] T3
Typ ukazateleT* TPtr
Obecný typT<R1, ...> TOfR1
Obecný typ argument!i typu C<TType> Ti
Obecný argument!!i metody metody M<MMethod> Mi
Vnořený typN.T N se připojí a pak T

Rekurzivní pravidla

Rekurzivně se použijí následující pravidla:

  • Protože Fakes používá jazyk C# ke generování sestavení Fakes, jakýkoli znak, který by vytvořil neplatný token jazyka C#, je uchvácený na "_" (podtržítko).

  • Pokud výsledný název koliduje s libovolným členem deklarujícího typu, použije se schéma číslování připojením dvoumístného čítače počínaje číslem 01.

Využití fakes Microsoftu v kontinuální integraci

Generování sestavení Microsoft Fakes

Microsoft Fakes je funkce dostupná výhradně v sadě Visual Studio Enterprise. Proto generování falešných sestavení vyžaduje použití úlohy sestavení sady Visual Studio při sestavování projektu.

Poznámka:

Alternativní strategie zahrnuje kontrolu falešných sestavení přímo do systému kontinuální integrace (CI) a využití úlohy MSBuild. Pokud se rozhodnete pro tento přístup, musíte do testovacího projektu zahrnout odkaz na sestavení s vygenerovaným sestavením Fakes, jak je znázorněno v následujícím fragmentu kódu:

<Project Sdk="Microsoft.NET.Sdk">
    <ItemGroup>
        <Reference Include="FakesAssemblies\System.Fakes.dll"/>
    </ItemGroup>
</Project>

Tento odkaz je potřeba přidat ručně, konkrétně pro projekty ve stylu sady SDK (tj. .NET Core, .NET 5 nebo .NET Framework), protože tyto projekty teď implicitně přidávají odkazy na sestavení. Pokud se rozhodnete použít tuto metodu, nezapomeňte aktualizovat sestavení Fakes vždy, když nadřazené sestavení prochází změnami.