Sdílet prostřednictvím


Konvence generování, kompilace a pojmenování kódu v Microsoft Fakes

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 SDK pro .NET Core, .NET 5.0 nebo novější je zobrazena jako náhled v sadě Visual Studio 2019 Update 6 a je ve výchozím nastavení povolena v aktualizaci 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ástupců je nakonfigurováno v souboru XML s příponou .fakes. Fakes framework se integruje do procesu sestavení prostřednictvím vlastních úloh MSBuild a detekuje tyto soubory během sestavení. Generátor kódu Fakes zkompiluje zástupné typy do sestavení a přidá je jako odkaz do projektu.

Následující příklad znázorňuje 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, aby se omezily typy, které by se měly stubovat. 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 oborech názvů System a System.IO, ale vylučuje jakýkoliv typ obsahující "handle" v System.

<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 určení, jak má probíhat porovnávání:

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

    el odpovídá "ahoj"

  • 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á "ahoj"

    hello! se shoduje s "hello"

  • Přidání * na konec filtru způsobí, že bude odpovídat předponě řetězce:

    el* neodpovídá "ahoj"

    he* shoduje se s "ahoj"

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

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

Částečné implementace konkrétních tříd a virtuální metody

Ve výchozím nastavení se typy stubů generují pro všechny nezapečetěné třídy. Typy zástupných objektů je možné omezit na abstraktní třídy 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 shim typy a stub typy pro typy, které jsou viditelné pro vygenerovaného sestavení Fakes. Chcete-li, aby byly interní typy shimovaného sestavení viditelné pro "Fakes" a testovací sestavení, přidejte atributy InternalsVisibleToAttribute do kódu shimovaného sestavení, které zajišťují viditelnost pro generované 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 obestavěné sestavení silně pojmenované a pokud chcete získat přístup k interním typům této sestavy:

  • Testovací sestavení i sestavení Fakes musí mít silný název.

  • Přidejte veřejné klíče sestavení test a Fakes do atributů InternalsVisibleToAttribute v shimmed sestavení. Takto by vypadaly atributy příkladu v kódu podepřeného sestavení, když je podepřené 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 silně podepsat testovací sestavení. Podívejte se na Strong-Named sestavení.

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 shimované sestavení, a to tak, že zadáte úplnou cestu k souboru .snk, který obsahuje alternativní klíč jako hodnotu atributu KeyFile v elementu Fakes\Compilation souboru .fakes. Napří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 čas sestavení. Čas sestavení můžete minimalizovat tak, že vygenerujete knihovny Fakes pro systémové knihovny .NET a knihovny 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 spusťte kompilaci.

  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 TestProject1 napodobouje mscorlib.dll z .NET Framework 2.0 a TestProject2 napodobouje mscorlib.dll pro rozhraní .NET Framework 4, což by oba vedly k vytváření mscorlib.Fakes.dll sestavení typu Fakes.

Aby se předešlo tomuto problému, Fakes by měly při přidávání souborů .fakes automaticky vytvářet kvalifikované názvy sestavení Fakes pro neprojektové reference. Název sestavení Fakes s verzi specifikovanou zahrnuje čí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 typu stubu

Namespaces

  • Do namespace 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 jmenného prostoru.

    Názvy typů

  • Předpona "shim" se přidá k názvu typu, aby se vytvořil název typu "shim".

    Typ shim pro typ Example je například ShimExample.

  • Předpona zástupného typu se přidá k názvu typu, aby se vytvořil název zástupného typu.

    Například StubIExample je stub typem typu IExample.

    Argumenty typů a vnořené struktury typů

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

  • Vnořená struktura typů se zkopíruje pro shim typy.

Konvence pojmenování pro vlastnosti shim delegáta nebo pole zástupných delegátů.

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 jsou zpracovány, jak je popsáno v následující tabulce:

Pokud je metoda... Example Připojený název metody
Konstruktor .ctor Constructor
Statický konstruktor .cctor StaticConstructor
Accessor s názvem metody složeným 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 napsány velkými písmeny a jejich pořadí bylo prohozeno
Získávací metoda 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
Příklad: + operátor op_Add AddOp
U operátoru převodu je návratový typ připojen. T op_Implicit ImplicitOpT

Poznámka:

  • Gettery a settery indexerů se zpracovávají podobně jako vlastnosti. Výchozí název indexeru je Item.
  • Názvy typů parametrů se transformují a jsou 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...
TypT T

Obor názvů, vnořená struktura a generika se odstraní.
Out parametruout T TOut
Parametr odkazuref T TRef
Typ poleT[] TArray
Multidimenzionální typ poleT[ , , ] T3
Typ ukazateleT* TPtr
Obecný typT<R1, ...> TOfR1
Obecný typ argument!i typuC<TType> Ti
Obecný argument!!i 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 v jazyce C#, je nahrazen znakem "_" (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í Microsoft Fakes 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 zahrnutí vašich Fakes Assemblies 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.