我正在为使用命名管道的类编写单元测试。我需要存根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?
答案 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等。从本质上讲,您将最终为您的单元测试构建一个单独的源模块副本,除了调用的系统调用的名称外,它们在各方面都是相同的。