vc++平台的TDD和DI

TDD and DI for VC++ platform

本文关键字:DI TDD 平台 vc++      更新时间:2023-10-16

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

由于MFC视图/文档是不可测试的,我将使他们尽可能愚蠢,并测试其他类与Boost测试框架。-请让我知道,如果你知道更好的方法或更好的测试框架,这种环境。

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

使用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这样的模拟框架(它们无论如何都需要接口),更容易管理资源(您永远不会有空指针)。