7
votes

Objets de modèle de domaine test unitaire

Dans notre modèle de modèle de domaine principal, nous avons une classe appelée "catégorie" dont le constructeur est interne par conception. Étant donné que le constructeur est interne, lors de la rédaction des cas de test de l'unité, je ne pourrai pas créer l'objet de "catégorie".

Donc, ma question, est-ce une meilleure pratique de rendre le constructeur public juste pour rendre la classe "catégorie" testable? Ou je ne devrais pas tester cette "catégorie", je devrais avoir testé la classe / méthode responsable de la création de cet objet?

ta,

rajeesh


2 commentaires

J'utilise c #. Le problème que je vois avec "InternalsVissiaTatoTribute" est que nous lions une témoignage au code réel.


Je propose de reformuler le titre reflétant que la question concerne le test unitaire d'une classe avec un constructeur privé / interne.


4 Réponses :


6
votes

Ne faites pas le public du constructeur uniquement pour des tests d'unités. Si d'un point de conception, vous avez décidé que cela devrait être interne, laissez-la de cette façon. Testez les classes qui invoquent ce constructeur.

in .NET Il y a le InternalsVissibletoTtribute qui vous permet d'exposer les membres internes aux tests unitaires.


0 commentaires

3
votes

Ajouter xxx

à votre montageInfo.cs. Ensuite, UnittestStassembl.dll est capable d'appeler vos méthodes internes. Plus d'infos est disponible ici .


0 commentaires

5
votes

TDD signifie test- conçu strong> et un corrolaire à ceci est qu'un constructeur ne peut pas vraiment être interne "par conception" si vous ne pouvez pas le tester.

considère pourquoi il est interne. Cela vous indiquera comment résoudre le problème. Vous ne devriez pas rendre le constructeur public juste pour pouvoir le tester, mais vous devriez-vous prendre en compte un design qui facilite la création de nouvelles instances. P>

Souvent, les constructeurs sont fabriqués interne pour protéger les invariants, mais vous pouvez aussi bien atteindre le même objectif avec un constructeur public qui prend l'entrée requise en tant que paramètres de constructeur. P>

public class MyClass
{
    private readonly string requiredString;

    public MyClass(string requiredString)
    {
        if (requiredString == null)
        {
            throw new ArgumentNullException("requiredString");
        }
        this.requiredString = requiredString;
    }
}


0 commentaires

0
votes

Vous pouvez envisager de créer une méthode d'usine statique nommée

Category *ConstructCategory_ForUnitTest();


0 commentaires