TDD и DI для платформы VC ++ - PullRequest
1 голос
/ 17 декабря 2011

Я пытаюсь настроить среду Agile и TDD для приложений MFC, требующих высокой производительности.

Поскольку MFC View / Document не подлежит тестированию, я собираюсь сделать их настолько глупыми, насколько это возможно, и протестировать другие классы с помощью инфраструктуры Boost Test.- Пожалуйста, дайте мне знать, если вы знаете лучший способ или лучший тестовый фреймворк для этой среды.

Чтобы заставить работать TDD, я думаю, что внедрение зависимостей имеет решающее значение для слабосвязанной структуры.Как мне этого добиться?Любая ссылка или намек будут оценены.

1 Ответ

1 голос
/ 17 декабря 2011

Используйте shared_ptr для интерфейсов, представляющих ваши классы.

Я думаю что-то вроде

#ifndef CLOCK_HPP_INCLUDED
#define CLOCK_HPP_INCLUDED

#include <boost/shared_ptr.hpp>


class Clock
{
public:
   static boost::shared_ptr<Clock> create();
   virtual void init() = 0;
   virtual double getSeconds() = 0;
   virtual void sleepUntilNext(double howMuch) = 0;

protected:  // No polymorphic deconstruction because of shared_ptr
   ~Clock()
   {}


};

#endif

Тогда вы можете просто взять реализацию часов в вашем конструкторе или использовать другой метод для установки реализации, например setClock или что-то в этом роде.

Примером этого будет

#include "clock.hpp"
class MyClass
{
public: 
   myClass(boost::shared_ptr<Clock> aClock) : myClock(aClock)
   {
       myClock.init();
   }

private:
   boost::shared_ptr<Clock> myClock;
}  

Тогда в вашем модульном тестировании вы можете сделать что-то вроде этого:

boost::shared_ptr<Clock> mock = createMockClock();
MyClass b(mock);

mock.assertThatInitIsCalled();

Вы также можете просто игнорировать ресурсы. Shared_ptr удалит себя.

Это приведет к небольшой потере производительности из-за динамического выделения, вызовов виртуальных функций и накладных расходов shared_ptr.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...