Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ů:
elodpoví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;woodpoví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.
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 spusťte kompilaci.
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.Fakesobsahuje 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.