2010-08-13 9 views
4

Y a-t-il un quelconque intérêt dans Unit-Testing pour une méthode dont la seule action est de déléguer le travail sur un autre objet? Exemple:Méthodes de délégation de tests unitaires

class abc { 

    ... 

    public void MoveLeft() 
    { 
     fallingPiece.MoveLeft(); 
    } 

    ... 
} 

Je fais des tests unitaires pour certaines classes existantes, à des fins d'apprentissage. Il semble étrange de faire un test d'unité pour cette méthode MoveLeft(), par exemple. Mais je ne sais pas comment cela aurait été si j'avais fait Test-First.

Merci

+0

Pourquoi avez-vous la méthode en premier lieu? YAGNI ... – arootbeer

+0

J'en ai besoin. J'ai alraedy avoir le code FallingPiece.MoveLeft() en cours d'exécution. –

Répondre

4

Votre code va-t-il tomber si je fais cela? Si c'est le cas, alors vous avez besoin d'un test pour l'attraper. Hypothèses: abc est un type public/exposé et fallingPiece est une dépendance. Si c'est le cas, vous avez besoin d'un test pour tester le comportement MoveLeft. Si ce n'est pas un type public, vous avez besoin d'un test pour le type public XYZ qui utilise abc en tant que colloborator/dependency. Vous ne le testez pas directement, mais il doit encore être testé.

+0

Hmmm. Je n'avais pas pensé à l'accessibilité d'abc. Je dirais que ce ne sera probablement pas public au monde extérieur. FallingPiece est en effet une dépendance. –

+0

@devoured ... voir mise à jour. – Gishu

1

Ma compréhension des tests unitaires est qu'ils sont là pour veiller à ce que la logique à l'intérieur d'une méthode reste la même lorsque vous ne l'avez pas l'intention pour cela de changer, et cette méthode n'a pas de logique en elle. Nous avons beaucoup de méthodes pass-through comme ça dans la base de code où je travaille. Apparemment, ce sont des classes «Controller», mais dans la plupart des cas, tout ce qu'ils font est de passer à la couche de données. Oui, vous pouvez les tester à l'unité, en supposant que vous avez un moyen de simuler fallingPiece. Si vous envisagez d'étendre la méthode MoveLeft pour inclure la logique, c'est probablement une bonne idée.

Cependant, à mon commentaire ci-dessus, il est probablement préférable de simplement mettre en ligne la méthode jusqu'à ce que vous ayez réellement besoin d'introduire la logique autour du déplacement à gauche.

+0

Hmm, je n'ai pas compris ce que vous vouliez dire en indiquant la méthode. Pourriez-vous être un peu plus clair? Merci –

+2

en soulignant je pense qu'il veut dire partout où vous avez MoveLeft() mis fallingPiece.MoveLeft(). Cela pourrait ne pas être une bonne idée si vous avez abc.MoveLeft et vous le remplacez par abc.fallingPiece.MoveLeft(). – derdo

+1

Je suis d'accord que abc.fallingPiece.MoveLeft() serait de mauvaise forme. Je devrais voir plus de code pour faire un commentaire constructif à ce stade. Cependant, en voyant votre réponse ci-dessous concernant cette méthode non publique, personne n'appellerait abc.fallingPiece.MoveLeft() de toute façon; juste un autre code à l'intérieur d'abc appelait fallingPiece.MoveLeft(). – arootbeer

0

Un cas où cette méthode peut échouer est lorsque fallingPiece est null lorsque Abc.MoveLeft est appelée. Avoir un cas de test qui construit un abc légitime et appelle abc.MoveLeft pourrait être une bonne idée. quelque chose comme CanMoveLeft() { Abc abc = new Abc(); abc.MoveLeft(); Assert.That (abc.fallingPice a été déplacé vers la gauche) }