使C++ COM类更加适合测试

Mr.*_*Boy 1 c++ com code-testing

我们的代码库有很多COM对象,所以通常我们会有类似的东西:

//this is the IDL-generated IGetTime interface header
#include "gettime.h"

//our COM class implementation of IGetTime
class CGetTime : public IGetTime
{
  public:
    CGetTime(CGetTimeCF &factory,...); //COM-specific constructor params
    /* IUnknown */
    STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR * ppv);
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG) Release();

    /* IGetTime */
    STDMETHODIMP GetTheTime(); //
};
Run Code Online (Sandbox Code Playgroud)

构造函数和其他一些东西的设置方式,这个类只能通过COM轻松使用...你可以破解创建对象的方法,但它往往是片状的.但是我很多情况下,没有COM就可以使用类的实际功能...如果你能这样做,这也更容易测试new CGetTime();

我想知道这样的事情是一种模式:

class CGetTimeBase
{
 public:
  STDMETHODIMP GetTheTime();
};

class CGetTime : public IGetTime, public CGetTimeBase
{
...
};
Run Code Online (Sandbox Code Playgroud)

这是一个很好的方法,还是有更好的方法来提供一个提供核心功能的'普通C++'类,以及一个COM类做COM的东西?为了最大限度地减少要编写的代码量,我认为不是不介绍包装器方法,而是在非COM类中使用实际的实现方法,因此它会自动出现在COM类中.

思考?};

ere*_*eOn 5

在我工作的地方,我们选择将核心C++类与这些类分开COM,原因如下:

  1. 更容易维护.那些不太了解COM的人可以专注于编写核心类,知道的人COM可以安全地包装核心类,而无需关心底层实现.

  2. 代码可重用性.这可能不是您的要求,但由于核心类与它们分离COM,我们直接在C++项目中使用它们,COM而不需要它们.

  3. 核心测试.由于逻辑与接口分离,因此您可以轻松地进行最小化测试.你不再怀疑:"我的泄漏在哪里?这是我的核心逻辑中的合法泄漏还是与之相关的东西COM?" 核心类可以独立有效地进行测试.

这会增加文件数量和编译时间,但我(我们)认为值得.