VC ++平台的TDD和DI

时间:2011-12-17 04:00:38

标签: c++ tdd

我正在尝试为需要高性能的MFC应用程序设置Agile和TDD环境。

由于MFC View / Document不可测试,我将尽可能使它们变得愚蠢,并使用Boost Test框架测试其他类。 - 如果您对此环境有更好的方法或更好的测试框架,请告诉我。

为了使TDD工作,我认为依赖注入对于松耦合结构至关重要。我怎样才能做到这一点?任何参考或提示将不胜感激。

1 个答案:

答案 0 :(得分:1)

将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

然后你可以在构造函数中使用clock实现,或者使用另一种方法来设置实现,比如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这样的模拟框架(它们无论如何都需要接口),以及更轻松的资源管理(你永远不会有空指针)。