Condividi tramite


Utilizzo delle funzioni di accesso private

Aggiornamento: novembre 2007

Poiché solo i metodi nella gerarchia di chiamata possono accedere a metodi privati o interni del codice in fase di test, i metodi di test richiedono funzioni di accesso private per chiamare indirettamente tale codice ad accesso limitato.

Una funzione di accesso privata è un assembly contenente implementazioni replicate di ciascun metodo dell'assembly del codice in fase di test. Ogni metodo nella funzione di accesso privata è pubblico e prende il nome del metodo corrispondente nel codice in fase di test. La chiamata di un metodo nella funzione di accesso privata richiama il metodo privato del codice in fase di test. In questo modo è più semplice ottenere l'accesso al codice con qualificatore di accesso private.

Nota:

La funzione di accesso privata consente inoltre ai test di accedere alle variabili private nel codice in fase di test.

Una funzione di accesso privata è un assembly compilato presente nella cartella Riferimenti test in Esplora soluzioni. Il formato del nome è <assembly_name>.private_accessor, dove <assembly_name> è il nome dell'assembly elencato nelle proprietà del progetto.

Nota:

Per ulteriori informazioni sulle modalità di test di elementi dotati di qualificatore di accesso interno, vedere Impostazione dell'attributo InternalsVisibleTo.

Creazione di funzioni di accesso private

Quando viene generato uno unit test per un metodo privato, in Visual Studio viene creata automaticamente una funzione di accesso privata, se non esiste già nel progetto di test.

La compilazione della soluzione causa l'aggiornamento dei riferimenti nella funzione di accesso privata. È quindi necessario, dopo la modifica del codice di produzione, effettuare una nuova compilazione per aggiornare la funzione di accesso privata di conseguenza.

Per informazioni sulla generazione di una funzione di accesso privata, vedere Procedura: testare un metodo privato.

Creazione manuale di funzioni di accesso private

Se non esiste una funzione di accesso privata per l'assembly in fase di test, è possibile generarne una senza generare metodi di test.

Per creare una funzione di accesso privata o ricreare una funzione di accesso privata eliminata, fare clic col pulsante destro del mouse nel codice in fase di test. Successivamente scegliere Crea funzione di accesso privata nel menu di scelta rapida, quindi selezionare il progetto di test in cui collocare l'assembly della funzione di accesso privata. Notare che tale voce di menu non apparirà se non esiste un progetto di test nella soluzione.

Nota:

È anche possibile creare una funzione di accesso privata da un prompt dei comandi, utilizzando l'utilità publicize.

Utilizzo delle funzioni di accesso private

Per testare codice privato, è necessario creare prima la funzione di accesso privata, come descritto in Procedura: testare un metodo privato. Il test deve quindi creare un'istanza dell'oggetto che accederà al metodo privato prima dell'esecuzione dei passaggi del test.

Ad esempio, il codice di produzione contiene il metodo seguente nella classe BankAccount:

private void FreezeAccount()
{
    m_frozen = true;
}

Nel seguente metodo di test viene testato il metodo FreezeAccount() privato. Per accedere al metodo FreezeAccount(), il metodo di test deve prima creare un'istanza dell'oggetto BankAccount_Accessor nell'assembly della funzione di accesso privata. Questo passaggio è necessario perché in BankAccount_Accessor è contenuta l'implementazione replicata di FreezeAccount(), il metodo da testare. Nel codice riportato di seguito viene chiamato FreezeAccount() tramite l'implementazione replicata della funzione di accesso privata.

Il seguente codice di esempio è stato generato automaticamente e quindi modificato da chi ha creato il test. Le istruzioni TODO indicano istruzioni nel codice del test che devono essere completate manualmente prima dell'esecuzione del test.

[TestMethod()]
public void FreezeAccountTest()
{
    BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton", 11.99); // TODO: Initialize to an appropriate value
target.FreezeAccount(); 
    // Assert.Inconclusive("A method that does not return a value cannot be verified.");
    
    bool creditAccount = false; // False means account could be credited: Fail test. 
    // Try to credit account
    try
    {
        target.Credit(1.00); 
    }
    catch (System.Exception)
    {
        // Threw exception. FreezeAccount worked correctly: Pass test. 
    creditAccount = true;
    }
    
    // Assert fails if 'creditAccount' condition is false. Fail test.
    Assert.IsTrue(creditAccount, "Was able to credit account.");
}

I dettagli di questo esempio sono riportati in Procedura dettagliata: creazione ed esecuzione di unit test.

Vedere anche

Attività

Procedura: testare un metodo privato