Question

J'ai une classe qui contient des calculs scientifiques complexes. Il est configuré pour autoriser uniquement un utilisateur à créer un cas correctement instancié. Toutefois, pour tester correctement le code, vous devez définir directement les variables d'état internes, car les documents de référence fournissent ces données dans leurs scénarios de test. Fait incorrectement, toutefois, cela peut invalider l'état.

Donc, je dois avoir la capacité, une fonction membre, de définir des variables internes à partir des programmes de tests unitaires. Mais je souhaite décourager fortement les utilisateurs normaux d’appeler cette fonction. (Oui, un utilisateur déterminé peut utiliser n'importe quoi ... mais je ne veux pas annoncer qu'il existe un moyen de faire quelque chose mauvais .)

Ce serait bien de pouvoir dire à Intellisense de ne pas afficher la fonction, par exemple.

La meilleure solution que j'ai à l'heure actuelle est de simplement nommer la fonction, par exemple: DangerousSet ().

Quelles autres options ai-je?

Suivi

J'ai trouvé la réponse de David B très utile à ma situation. Merci!
La suggestion de Mufasa d'utiliser la réflexion était excellente, mais plus difficile à mettre en œuvre (pour moi).
La suggestion de Chris d'utiliser un décorateur était bonne, mais n'a pas abouti.
La suggestion de BFree sur XML est également bonne et était déjà utilisée, mais ne résout pas vraiment le problème.

Enfin, la suggestion de BillTheLizard selon laquelle le problème réside dans les documents source ne peut pas être contrôlée. Les experts internationaux publient des livres et des articles de revues hautement techniques à l'usage de leur communauté. Le fait qu’ils ne répondent pas à mes besoins particuliers est une réalité. Il n'y a tout simplement pas de documents alternatifs.

Était-ce utile?

La solution

Supposons que vous souhaitiez tester cet objet en manipulant ses champs.

public class ComplexCalculation
{
    protected int favoriteNumber;
    public int FavoriteNumber
    {
        get { return favoriteNumber; }
    }
}

Placez cet objet dans votre assemblage de test / espace de nom:

public class ComplexCalculationTest : ComplexCalculation
{
    public void SetFavoriteNumber(int newFavoriteNumber)
    {
        this.favoriteNumber = newFavoriteNumber;
    }
}

Et écrivez votre test:

    public void Test()
    {
        ComplexCalculationTest myTestObject = new ComplexCalculationTest();
        myTestObject.SetFavoriteNumber(3);
        ComplexCalculation myObject = myTestObject;

        if (myObject.FavoriteNumber == 3)
            Console.WriteLine("Win!");

    }

PS: Je sais que vous avez dit interne , mais je ne pense pas que vous vouliez dire interne .

Autres conseils

Vous pouvez utiliser InternalsVisibleToAttribute à marquer les membres internes comme visibles pour votre assemblage de test. Il semble briller lorsqu'il est utilisé dans ce contexte, bien que ce ne soit pas tout à fait un "ami".

  1. Marquez votre fonction DangerousSet interne au lieu de public .

  2. Dans Properties \ AssemblyInfo.cs du projet contenant DangerousSet :

    [assembly: InternalsVisibleTo ("YourTestAssembly")]

Si vous avez deux assemblages de test pour une raison quelconque, la syntaxe est la suivante:

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]

Décorez votre méthode avec cet attribut:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

Cela le cachera à Intellisense.

EDIT:

Mais apparemment, cela présente un inconvénient assez important: "Dans Visual C #, EditorBrowsableAttribute ne supprime pas les membres d'une classe du même assemblage." via MSDN .

Il semble que votre vrai problème réside dans vos documents de référence. Vous ne devriez pas tester des cas impossibles à rencontrer avec une utilisation correcte de votre classe. Si les utilisateurs ne doivent pas être autorisés à modifier l’état de ces variables, vos tests ne le devraient pas non plus.

Vous pouvez également utiliser la réflexion. La recherche Google a révélé Tester des méthodes privées à l'aide de réflexions .

Votre code de test peut-il inclure une sous-classe de la classe de calcul? Si tel est le cas, vous pouvez marquer la fonction protected et seuls les héritiers pourront l'utiliser. Je suis à peu près sûr que cela le supprime également d’intelliSense, mais je peux me tromper à ce sujet.

Ce que j’ai fait par le passé, c’est de mettre les commentaires XML en fonction de la méthode et d’utiliser la section pour écrire en gros caractères gras. NE PAS UTILISER CETTE MÉTHODE ou autre. Ainsi, si quelqu'un essayait de l'utiliser, Intellisense l'en avertirait gentiment.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top