在cppunit测试中存储WinBase.h

时间:2015-06-14 23:24:30

标签: c++ unit-testing named-pipes cppunit

我正在为使用命名管道的类编写单元测试。我需要存根CreateNamedPipe,ConnectNamedPipe,WriteFile,ReadFile,FlushFileBuffers,DisconnectNamedPipe,CloseHandle和GetLastError

这些都在WinBase.h中定义为dll导入。

不幸的是,WinBase.h是一个在任何地方都使用的巨大文件,所以不能只是将你要测试的项目存根...

我尝试复制WinBase.h并制作函数的内联版本:

bool
ConnectNamedPipe(
    __in        HANDLE hNamedPipe,
    __inout_opt LPOVERLAPPED lpOverlapped
    )
{ return false; }

但是每次重写的函数/对象都会出现编译错误:

3>test.obj : error LNK2005: ReadFile already defined in main.obj

主要是非常小的,但确实包含

#include <file_templates/cppunit/generic_cppunit_main.cpp>

其中可能包含WinBase.h的深度......

即使我解决了这个编译错误,我也有可能在这个过程中破坏cppunit?

任何解决方案都不是抽象出所有管道调用而是将抽象存在而不是WinBase.h?

1 个答案:

答案 0 :(得分:1)

在我看来,通过抽象重定向进行删除是最好的方法,让你尽可能地保持理智。完全可以使用预处理器完成此操作,并且没有运行时开销。只需在课堂上使用以下设计模式:

#ifndef MY_CREATE_NAMED_PIPE
#define MY_CREATE_NAMED_PIPE CreateNamedPipe
#endif

#ifndef MY_CONNECT_NAMED_PIPE
#define MY_CONNECT_NAMED_PIPE ConnectNamedPipe
#endif

......等等。然后,让您的代码使用#defined别名调用系统调用。

随意使用您喜欢的任何修改惯例。

然后,在您的单元测试模块中:

#define MY_CREATE_NAMED_PIPE my_create_named_pipe
#define MY_CONNECT_NAMED_PIPE my_connect_named_pipe

// And so on, then include your source module directly:

#include "source.cpp"

然后,您的单元测试模块将实现my_create_named_pipe()stubs等。从本质上讲,您将最终为您的单元测试构建一个单独的源模块副本,除了调用的系统调用的名称外,它们在各方面都是相同的。