2010-01-17 7 views
2

Nouveau dans le monde de TDD et j'ai bientôt découvert que moquer parfois n'est pas aussi facile. Nous utilisons MOQ au travail, donc j'ai besoin d'apprendre comment faire cela en utilisant moqMoq et Motif de commande. Je suis en difficulté pouvez-vous aider?

J'ai un peu de code en utilisant le modèle de commande et fonctionne un régal.Cependant, si je devais tester le conduire, je ne saurais pas comment le faire mettre en œuvre le code ci-dessous.

Je l'ai fait ce qui suit

  • Créé BaseToolStripMenuItem: ToolStripMenuItem et ajouté une propriété de commande (voir ci-dessous)
  • créé une forme de fenêtres et a ajouté un MenuStrip avec 2 Ouvrir et Quitter

Dans le formulaire que je viens d'ajouter à la carte de la commande à un bouton et tout fonctionne un régal.

Je voudrais changer le code afin que je puisse UnitTest en utilisant Moq mais ne vois pas comment ???

Pouvez-vous m'aider?

Des suggestions?

Merci beaucoup!

public interface ICommand 
     { 
     void Execute() 
     } 

     public abstract class BaseCmd :ICommand 
     { 
      protected ProcessMenuCommand ProcessCommand; 
      protected MenuCommandFactory Factory; 

      protected BaseCmd(ProcessMenuCommand processMenuCommand, MenuCommandFactory cmdfactory) 
      { 
       ProcessCommand = processMenuCommand; 
       Factory = cmdfactory; 
      } 

      abstract public void Execute(); 
     } 

    public class BaseToolStripMenuItem : ToolStripMenuItem 
    { 
     public BaseToolStripMenuItem() 
     { 
      Click += MenuItemClick; 
      Command = null; 
     } 

     public BaseCmd Command { get; set; } 

     private void MenuItemClick(object sender, EventArgs args) 
     { 
      if (Command != null) Command.Execute(); 
     } 
    } 
    public class MenuCommandFactory 
    { 
     private readonly ProcessMenuCommand _processMenuCommand; 

     public MenuCommandFactory(ProcessMenuCommand processMenuCommand) 
     { 
      _processMenuCommand = processMenuCommand; 
     } 

     public OpenFileCmd OpenFile() 
     { 
      return new OpenFileCmd(_processMenuCommand,this); 
     } 

     public ExitCmd Exit() 
     { 
      return new ExitCmd(_processMenuCommand, this); 
     } 
    } 

    public class OpenFileCmd:BaseCmd 
    { 
     public OpenFileCmd(ProcessMenuCommand processMenu,MenuCommandFactory menuCommandFactory) 
      :base(processMenu,menuCommandFactory) 
     { 
     } 
     public override void Execute() 
     { 
      ProcessCommand.OpenFile(); 
     } 
    } 

    public class ProcessMenuCommand 
    { 
     public void OpenFile() 
     { 
      MessageBox.Show("Open a file"); 
     } 

     public void Exit() 
     { 
      MessageBox.Show("Exiting"); 
     } 
    } 
    public class ExitCmd:BaseCmd 
    { 
     public ExitCmd(ProcessMenuCommand processMenu, MenuCommandFactory menuCommandFactory) 
      :base(processMenu,menuCommandFactory) 
     { 
     } 
     public override void Execute() 
     { 
      ProcessCommand.Exit(); 
     } 
    } 

    //In the form 
    public partial class Form1 : Form 
    { 
     private ProcessMenuCommand menuCommandProcessor; 
     private MenuCommandFactory factory; 
     public Form1() 
     { 
      InitializeComponent(); 

      // Created editor and factory. 
      menuCommandProcessor = new ProcessMenuCommand(); 
      factory = new MenuCommandFactory(menuCommandProcessor); 

      // Get concrete command objects from factory and assign to corresponding menu items and tool strip buttons. 
      tsOpen.Command = factory.OpenFile(); 
      tsExit.Command = factory.Exit(); 
     } 
    } 
+0

Pouvez-vous affiner un peu la partie ou la fonctionnalité que vous aimeriez tester mais que vous trouvez difficile? – Mathias

Répondre

3

si devaient tester le conduire je ne sais pas comment faire la mise en œuvre du code ci-dessous

L'idée de TDD est qu'il disques que vous vers une mise en œuvre. Il existe de nombreuses implémentations que vous ne pourriez jamais utiliser en utilisant TDD, donc votre question n'a pas vraiment de sens.

Essayez d'écrire des tests qui vous conduisent vers votre objectif sans avoirune image préconçue de la solution à laquelle vous souhaitez arriver. Il s'avère souvent que vous vous retrouvez dans un endroit entièrement différent (et meilleur) que ce que vous pensiez à l'origine.

+0

Ce que vous dites est tout à fait logique, et c'est tellement vrai. Quelle que soit ma question serait que Comment puis-je tester un modèle de commande en utilisant Moq? Tous les exemples Merci – user9969

+0

Je ne suis pas paresseux.C'est juste ma connaissance de Moq et TDD qui me laisse tomber. – user9969

+0

Je ne dis pas que vous êtes paresseux :) Mon point est que vous ne pouvez pas laisser les tests guider la direction si vous avez déjà décidé où vous voulez aller. Au mieux, ça va être beaucoup plus difficile que ça devrait l'être. –

1

Une simple règle des novices: pas de classes abstraites. Essayez de concevoir à nouveau avec uniquement des interfaces et des classes concrètes. Vous remarquerez qu'il est plus facile de tester le résultat. Comme pour "comment TDD un objet de commande", une commande est juste une classe qui fournit une seule action. Testez-le de la même manière que vous testeriez n'importe quelle méthode, sauf que vous nommez la méthode Execute().