2009-10-02 8 views
2

J'ai la classe suivante:C#: Comment puis-je vérifier que les méthodes sont appelées dans un certain ordre?

public class Script 
{ 
    IPrinter _printer; 

    public Script(IPrinter printer) 
    { 
     _printer = printer; 
    } 

    public void Print(TextWriter writer) 
    { 
     _printer.PrintComment(writer, "lolz"); 
     writer.WriteLine("omg this complicates things"; 
     _printer.PrintSpecial(writer); 
     if (signoff) 
      _printer.PrintComment(writer, "kthxbye"); 
    } 
} 

Comment puis-je configurer un test pour les méthodes affirme que l'imprimante sont appelés dans l'ordre correct avec les paramètres appropriés?

Je pourrais créer manuellement une fausse imprimante et faire un test d'état sur l'écriture, mais comme le contexte est grand (d'autant plus que le script travaille aussi avec l'auteur) j'aimerais l'éviter. J'utilise des mock nunit et rhinocéros. Toutes les réflexions sur les changements architecturaux ou les procédures de moquerie pour le rendre plus facile à tester sont appréciées. Le vrai code avec lequel je travaille est malheureusement plus complexe - mais c'est l'essentiel.

Répondre

5

Vous ne pouvez pas utiliser la syntaxe statique AAA pour vérifier les comportements dans Rhino, malheureusement, vous devez retourner à l'ancien style de "Replay" pour le faire AFAIK.

Je ne suis pas un expert de rhinocéros, je l'habitude d'utiliser Moq, mais je pense que cela est correct:

var mocks = new MockRepository(); 
var printer = mocks.DynamicMock<IPrinter>(); 
using (mocks.Ordered()) 
{ 
    printer.Expect(x => x.PrintComment()); 
    printer.Expect(x => x.PrintSpecial()); 
    printer.Expect(x => x.PrintComment()); 
} 
printer.Replay(); 
Script = new Script(printer); 

... Execute Test... 

printer.VerifyAllExpectations(); 
+0

Remplacez la ligne trois par 'using (mocks.Ordered())' pour que la syntaxe soit correcte. –

+0

Ah, c'est vrai. Ok, je l'ai mis à jour, merci :) – womp

3

Vous ne devriez pas avoir besoin de tester les méthodes d'ordre appelées. Vous devez effectuer un test pour vous assurer que les bons effets se sont produits parce que vous avez appelé la méthode Print. Cependant, si vous devez vraiment faire cela, je pense que le meilleur moyen serait de créer un faux IPrinter qui stocke les fonctions d'ordre ont été appelés, et les paramètres qui ont été passés, qui peuvent ensuite être affirmés dans les tests.

+2

ordre des méthodes d'essai est appelé test de comportement, et il y a beaucoup de raisons de le faire, donc Je ne suis pas du tout d'accord avec vos affirmations. Le test d'état n'est pas le seul moyen d'écrire des tests unitaires! – womp

0

Vous ne devriez pas avoir besoin de tester le compilateur. Si vous faisiez une sorte de filetage, je pourrais le voir ... mais dans ce cas, avec ce que vous avez posté, vous ne l'êtes pas.

Comme vous l'avez dit, vous pouvez créer une maquette d'imprimante, et tester que les méthodes sont appelées dans l'ordre, mais ce serait redondant. Il serait probablement préférable de lancer des exceptions dans des méthodes particulières si les conditions préalables (c'est-à-dire les méthodes précédentes) ne sont pas appelées, mais cela indique qu'il est nécessaire de refactoriser en une seule méthode.

En outre, vous pouvez utiliser le modèle template method pour vous assurer que les méthodes sont appelées dans l'ordre, mais à moins que vous ne disposiez d'objets supplémentaires qui nécessiteront cette commande, ce serait excessif.

Questions connexes