Condividi tramite


Generazione del codice, compilazione e convenzioni di denominazione in Microsoft Fakes

In questo argomento vengono descritte le opzioni e i problemi di falsificazione nella generazione e compilazione di codice. Descrive le convenzioni di falsificazione nella denominazione per i tipi generati, i membri e i parametri.

Requisiti

  • Visual Studio Ultimate

In questo argomento

Ecco cosa è possibile acquisire:

Code generation and compilation

Fakes Naming Conventions

Generazione di codice e compilazione

Hh708916.collapse_all(it-it,VS.110).gifGenerazione di codice di configurazione degli stub

La generazione dei tipi stub è configurata in un file XML con estensione di file .fakes.Il framework di falsificazione è integrato nel processo di compilazione tramite le attività MSBuild personalizzate e rileva tali file in fase di compilazione.Il generatore di codice di falsificazione compila i tipi stub in un assembly e aggiunge il riferimento al progetto.

L'esempio seguente illustra i tipi stub definiti in FileSystem.dll:

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

Hh708916.collapse_all(it-it,VS.110).gifFiltro del tipo

I filtri possono essere impostati nel file .fakes per limitare i tipi per i quali deve essere generato lo stub.È possibile aggiungere un numero illimitato di Clear, Aggiungi, Rimuovi elementi nell'elemento StubGeneration per compilare l'elenco dei tipi selezionati.

Ad esempio, il file di .fakes genera stub per tipi negli spazi dei nomi System.IO e di sistema, ma esclude qualsiasi tipo che contiene "handles" nel sistema:

<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>

Le stringhe di filtro utilizzano una sintassi semplice per definire come la corrispondenza deve essere eseguita:

  • i filtri sono senza distinzione tra maiuscole e minuscole per impostazione predefinita; i filtri eseguono una corrispondenza nella sottostringa:

    el trova corrispondenza in "hello"

  • L'aggiunta di ! alla fine del filtro genererà distinzione tra maiuscole e minuscole:

    el! non corrisponde a "hello"

    hello! trova corrispondenza in "hello"

  • L'aggiunta di * alla fine del filtro lo farà corrispondere al prefisso della stringa:

    el* non corrisponde a "hello"

    he* trova corrispondenza in "hello"

  • Più filtri in un elenco separato da punti e virgola sono combinati come OR:

    el;wo corrisponde a "hello" e "world"

Hh708916.collapse_all(it-it,VS.110).gifGenerare stub per classi concrete e metodi virtuali

Per impostazione predefinita, i tipi stub sono generati per tutte le classi unsealed.È possibile limitare i tipi dello stub alle classi astratte tramite il file di configurazione .fakes:

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

Hh708916.collapse_all(it-it,VS.110).gifFirma con nome sicuro

Il framework di falsificazione automaticamente firmerà l'assembly di falsificazione generato quando l'assembly verrà firmato con nome sicuro.Il framework di falsificazioni utilizzerà sempre la stessa chiave a meno che l'utente non specifichi una chiave diversa per firmare l'assembly.Una chiave diversa può essere specificata nel file .fakes.

<Fakes ...>
  <Compilation KeyFile="path to the key file" />
</Fakes>

Hh708916.collapse_all(it-it,VS.110).gifTipi interni

Il generatore di codice di falsificazione genererà tipi shim e stub per i tipi visibili dall'assembly di falsificazione generato.Per rendere visibili i tipi interni è possibile aggiungere un attributo InternalsVisibleTo all'assembly che offre visibilità all'assembly di falsificazione generato.

[assembly: InternalsVisibleTo("FileSystem.Fakes")]

Se l'assembly reso shim è firmato in modo sicuro, il framework Fakes firmerà in modo automatico il codice generato da Fakes.In tal caso, gli attributi InternalsVisibleToAttribute hanno necessità di fare riferimento al nome dell'assembly e alla chiave pubblica.Il framework di falsificazioni utilizza sempre la stessa chiave per firmare l'assembly, pertanto si utilizza questo frammento come punto di partenza per aggiungere l'attributo InternalsVisibleTo al progetto.

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

Hh708916.collapse_all(it-it,VS.110).gifOttimizzazione dei tempi di compilazione

La compilazione degli assembly di falsificazioni può aumentare notevolmente il tempo di compilazione.È possibile ridurre il tempo di compilazione generando gli assembly di falsificazione per gli assembly di sistema .NET e gli assembly di terze parti in un progetto decentralizzato.Poiché tali assembly cambiano raramente nel computer, è possibile utilizzare gli assembly di falsificazione generati in altri progetti.

Dai progetti di unit test, è possibile eseguire semplicemente un riferimento agli assembly di falsificazione compilati ed inseriti nel FakesAssemblies nella cartella del progetto.

  1. Creare una nuova libreria di classi con la versione del runtime .NET corrispondente ai progetti di test.Che verrà denominata Fakes.Prebuild.Rimuovere il file class1.cs nel progetto che non necessario.

  2. Aggiungere il riferimento a tutti gli assembly di terze parti e di sistema per i quali sono necessarie le falsificazioni.

  3. Aggiungere un file .fakes per ogni assembly e compilazione.

  4. Dal progetto di test, aggiungere un riferimento ad un assembly e di passare alla cartella Fakes.Prebuild\FakesAssemblies e individuare l'assembly appropriato.

Hh708916.collapse_all(it-it,VS.110).gifEvitare di provocare conflitti di nome assembly

In un ambiente di compilazione Team, tutti gli output di compilazione vengono uniti in una singola directory.Nel caso in cui più progetti utilizzino le falsificazioni, può accadere che gli assembly di falsificazione di una versione eseguano l'override su un'altra versione.Ad esempio, le falsificazioni del TestProject1 mscorlib.dll dal .NET Framework 2.0 e TestProject2 mscorlib.dll per il .NET Framework 4 chiamerebbero entrambe l'assembly di falsificazione di mscorlib.Fakes.dll.

Per evitare questo problema, le falsificazioni devono creare automaticamente versioni con i nomi di assembly di falsificazioni qualificati per i riferimenti che non sono di progetto quando vengono aggiunti i file .fakes.Un nome assembly di falsificazioni qualificato con la versione include un numero di versione quando si crea il nome dell'assembly di falsificazione:

Dato un assembly MyAssembly e una versione 1.2.3.4, il nome dell'assembly di falsificazioni è MyAssembly.1.2.3.4.Fakes.

È possibile modificare o rimuovere questa versione modificando l'attributo di versione dell'elemento dell'assembly in .fakes:

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

Convenzioni di denominazione delle falsificazioni

Hh708916.collapse_all(it-it,VS.110).gifConvenzioni di denominazione per tipi resi shim e tipi stub

Spazi dei nomi

  • Il suffisso .Fakes viene aggiunto allo spazio dei nomi.

    Ad esempio, lo spazio dei nomi System.Fakes contiene i tipi lo spessore di spazi dei nomi system.

  • Global.Fakes contiene il tipo lo spessore dello spazio dei nomi vuoto.

Nomi dei tipi

  • Un prefisso reso shim è aggiunto al nome del tipo per creare il nome del tipo reso shim.

    Per esempio, ShimExample è un tipo reso shim del tipo Example.

  • Il prefisso stub viene aggiunto al nome del tipo per compilare il nome del tipo stub.

    Ad esempio, StubIExample è il tipo dello stub del tipo IExample.

Argomenti di tipo e strutture di tipo annidato

  • Gli argomenti di tipo generico vengono copiati.

  • Una struttura di tipo annidato viene copiata per i tipi resi shim.

Hh708916.collapse_all(it-it,VS.110).gifConvenzioni di denominazione per proprietà delegate rese shim o campi stub delegati

Regole di base per il campo di denominazione, a partire da un nome vuoto:

  • Il nome del metodo è aggiunto.

  • Se il nome del metodo è un'implementazione di interfaccia esplicita, i punti vengono rimossi.

  • Se il metodo è generico, Ofn viene aggiunto dove n è il numero di argomenti generici del metodo.

Nomi speciali dei metodi come il metodo Get o Set per una proprietà vengono considerati come descritti nella tabella seguente.

Se il metodo è…

Esempio

Nome del metodo aggiunto

Un costruttore

.ctor

Constructor

Un costruttore statico

.cctor

StaticConstructor

funzione di accesso con il nome del metodo costituito da due parti è separato da "_" (come metodo Get della proprietà)

kind_name (caso generale, ma non applicato da ECMA)

NameKind, dove entrambe le parti sono state scritte con il maiuscolo e scambiate

Metodo Get della proprietà Prop

PropGet

Metodo set della proprietà Prop

PropSet

Addizionatore di evento

Add

Rimovitore di evento

Remove

Un operatore costituito da due parti

op_name

NameOp

Ad esempio: operatore +

op_Add

AddOp

Per un operatore di conversione, il tipo restituito è aggiunto.

T op_Implicit

ImplicitOpT

Note

  • Metodi Get e Set per gli indicizzatori vengono considerati analogamente alla proprietà.Il nome predefinito per un indicizzatore è Item.

  • I nomi del tipo di parametro vengono modificati e concatenati.

  • Il tipo restituito viene ignorato a meno che non ci sia ambiguità di overload.In questo caso, il tipo restituito viene aggiunto alla fine del nome

Hh708916.collapse_all(it-it,VS.110).gifConvenzioni di denominazione del tipo di parametro

Dato

La stringa aggiunta è…

Un tipoT

T

Lo spazio dei nomi, la struttura annidata e i tic generici vengono eliminati.

Un parametro outout T

TOut

Un parametro refref T

TRef

Un tipo arrayT[]

TArray

Un tipo array multi-dimensionaleT[ , , ]

T3

Un tipo puntatore, T*

TPtr

Un tipo genericoT<R1, …>

TOfR1

Un argomento di tipo generico!i di tipo C<TType>

Ti

Un argomento generico del metodo!!i del metodo M<MMethod>

Mi

Un tipo annidatoN.T

N viene aggiunta, dopo T

Hh708916.collapse_all(it-it,VS.110).gifRegole ricorsive

Le regole seguenti sono applicate in modo ricorsivo:

  • Poiché le falsificazioni utilizza il linguaggio c per generare assembly di falsificazioni, qualsiasi carattere che produrrebbe un token non valido c viene utilizzato caratteri di escape a _" sottolineatura ().

  • Se un nome risultante non è compatibile con nessun membro del tipo dichiarante, una combinazione di numerazione viene utilizzata aggiungendo un contatore a due cifre, partendo da 01.

Risorse esterne

Hh708916.collapse_all(it-it,VS.110).gifLinee guida

Verifica della Continuous Delivery con Visual Studio 2012 – Capitolo 2: Test delle Unità: Test dell'interno

Vedere anche

Concetti

Isolamento del codice sottoposto a test con Microsoft Fakes