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 Fakes
Compilation
\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.
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.
Přidejte odkaz na všechna sestavení systému a třetích stran, pro která potřebujete Fakes.
Přidejte soubor .fakes pro každé sestavení a sestavení.
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á,
Of
n 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.