【发布时间】:2015-06-14 23:24:30
【问题描述】:
我正在为使用命名管道的类编写单元测试。我需要存根 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
Main 非常小,但确实包含
#include <file_templates/cppunit/generic_cppunit_main.cpp>
这很可能在其深处的某个地方包含 WinBase.h...
即使我解决了这个编译错误,我也有可能在这个过程中破坏 cppunit?
是否有没有抽象出所有管道调用并存根抽象而不是 WinBase.h 的解决方案?
【问题讨论】:
-
如果您想在头文件中提供内联实现,您可以,但您需要使用
inline关键字声明这些函数。否则你会得到链接器错误。 -
您需要让链接器满意。它不会喜欢从两个 .lib 文件中选择一个最喜欢的。但是您不会遇到 ReadFile 存在于 .obj 文件中的问题,它会首先选择那个。
标签: c++ unit-testing named-pipes cppunit