c++ - 在 cppunit 测试中 stub WinBase.h

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

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

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

不幸的是,WinBase.h 是一个到处都在使用的巨大文件,因此不能仅仅将要测试的项目 stub ...

我尝试复制 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 之外,还有什么解决方案吗?

最佳答案

在我看来,通过抽象重定向停止几乎是最好的方法,让您尽可能保持理智。完全使用预处理器可以做到这一点,而且没有运行时开销。只需在您的类(class)中使用以下设计模式:

#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 别名调用系统调用。

请随意使用您喜欢的任何 munging 约定。

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

#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() stub 等。本质上,您最终将构建源模块的单独拷贝,用于单元测试,除了调用的系统调用的名称外,它在各个方面都是相同的。

关于c++ - 在 cppunit 测试中 stub WinBase.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835586/

相关文章:

c++ - Intel TBB 会在 AMD 处理器上工作吗?

c++ - 命名空间未定义或重新定义,为什么?

angular - 如何使用 Jasmine 在 Angular 单元测试中模拟 window.screen.width

用于表单编辑的 Django 单元测试

.net - 删除命名管道 .NET

c++ - 神经网络对测试样本给出相同的结果

c++ - 这个语法是什么? C++

java - 对内部使用对象实例的方法进行单元测试

c# - 内存映射文件是否比命名管道更快?

c# - WCF - 最快的进程间通信