Partager via


Utilisation d'accesseurs private

Mise à jour : novembre 2007

Dans la mesure où seules les méthodes de la hiérarchie appelante peuvent accéder aux méthodes privées ou internes de code sous test, les méthodes de test requièrent que les accesseurs private appellent indirectement un code d'accès limité.

Un accesseur private est un assembly qui contient des implémentations fictives de chaque méthode de l'assembly du code sous test. Chaque méthode de l'accesseur private est publique et prend le nom de la méthode correspondante dans le code sous test. L'appel d'une méthode dans l'accesseur private appelle la méthode privée du code sous test. Cela facilite l'accès au code ayant le qualificateur d'accès private.

Remarque :

L'accesseur private permet également à vos tests d'accéder aux variables privées de votre code sous test.

Un accesseur private est un assembly compilé dans le dossier Références de test de l'Explorateur de solutions. Il porte le nom <assembly_name>.private_accessor, < nom_assembly > étant le nom de l'assembly répertorié dans les propriétés de votre projet.

Remarque :

Pour plus d'informations sur la façon de tester des éléments ayant le qualificateur d'accès interne, consultez Définition de l'attribut InternalsVisibleTo.

Création d'accesseurs private

Lorsque vous générez un test unitaire pour une méthode privée, Visual Studio crée automatiquement un accesseur private à moins que ce dernier n'existe déjà dans le projet de test.

La génération de la solution entraîne la mise à jour des références dans l'accesseur private. Par conséquent, après avoir modifié votre code de production, vous devez recompiler pour mettre à jour votre accesseur private en conséquence.

Pour plus d'informations sur la façon de générer un accesseur private, consultez Comment : tester une méthode privée.

Création manuelle d'accesseurs private

S'il n'existe pas d'accesseur private pour l'assembly sous test, il est possible d'en générer un sans générer de méthodes de test.

Pour créer un accesseur private ou pour recréer un accesseur private ayant été supprimé, cliquez avec le bouton droit sur le code sous test. Cliquez ensuite sur Créer un accesseur private dans le menu contextuel, puis sélectionnez le projet de test dans lequel placer l'assembly d'accesseur private. Notez que cet élément de menu n'apparaît pas si aucun projet de test n'existe dans la solution.

Remarque :

Vous pouvez également créer un accesseur private à partir d'une invite de commandes à l'aide de l'utilitaire publicize.

Utilisation d'accesseurs private

Pour tester un code privé, vous devez d'abord créer l'accesseur private, comme décrit dans Comment : tester une méthode privée. Votre test doit ensuite instancier l'objet qui accédera à votre méthode privée avant l'exécution des étapes de test.

Votre code de production peut, par exemple, contenir la méthode suivante dans la classe BankAccount :

private void FreezeAccount()
{
    m_frozen = true;
}

La méthode de test suivante teste la méthode FreezeAccount() privée. Pour accéder à la méthode FreezeAccount(), la méthode de test doit d'abord instancier l'objet BankAccount_Accessor dans l'assembly d'accesseur private. Ceci est nécessaire car BankAccount_Accessor contient l'implémentation fictive de FreezeAccount(), la méthode que vous souhaitez tester. Dans le code suivant, FreezeAccount() est appelé via l'implémentation fictive de l'accesseur private.

L'exemple de code suivant a été généré automatiquement, puis modifié par la personne qui a créé le test. Les instructions TODO sont des instructions dans le code de test qui doivent être effectuées manuellement avant l'exécution du 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.");
}

Cet exemple est décrit plus en détail dans Procédure pas à pas : création et exécution de tests unitaires.

Voir aussi

Tâches

Comment : tester une méthode privée