Moq и Command Pattern. Я борюсь, вы можете помочь? - PullRequest
2 голосов
/ 17 января 2010

Новое в мире TDD, и я скоро обнаружил, что порой издеваться не так просто. Мы используем MOQ на работе, поэтому мне нужно научиться делать это, используя moq

У меня есть некоторый код, использующий шаблон команд и работающий с лечением. Однако, если бы он тестировал диск, я бы не знал, как это сделать, реализуя приведенный ниже код.

Я сделал следующее

  • Создано BaseToolStripMenuItem: ToolStripMenuItem и добавлено свойство команды (см. Ниже)
  • Создала форму окна и добавила menuStrip с 2 пунктами Open и Exit

В форме, которую я просто добавляю, чтобы отобразить команду на кнопку, и все работает угощение.

Я хотел бы изменить код, чтобы я мог использовать UnitTest с помощью Moq, но не могу понять, как ???

Вы можете помочь?

Есть предложения?

Большое спасибо !!

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();
        }
    }

Ответы [ 2 ]

3 голосов
/ 17 января 2010

Однако, если бы он тестировал диск, я бы не знал, как это сделать, используя приведенный ниже код

Идея о TDD заключается в том, что он ведет к реализации. Существует множество реализаций, которые вы никогда не могли бы найти, используя TDD, поэтому ваш вопрос не имеет особого смысла.

Попробуйте написать несколько тестов, которые приведут вас к вашей цели без с предвзятым образом решения , к которому вы хотите прийти. Часто оказывается, что вы оказались в совершенно другом (и лучшем) месте, чем вы думали изначально.

1 голос
/ 20 января 2010

Простое правило для начинающих: нет абстрактных классов. Попробуйте проектировать снова только с интерфейсами и конкретными классами. Вы заметите, что тестировать результат проще.

Что касается "как TDD объекта Command", команда - это просто класс, который обеспечивает одно действие. Проведите тест-драйв так же, как вы тестировали бы любой метод, за исключением того, что вы назвали метод Execute().

...