![](/img/trans.png)
[英]How to check a function is called in a destructor in a unit test in C++?
[英]Google test: how to check a global C (C++) function was called
我正在编写嵌入在C(或C ++)应用程序中的脚本语言的测试用例,其中一个特性是脚本语言从“主机”程序调用一个方法。 整个项目使用谷歌测试框架,这里是其中一个测试:
TEST(Functions, ExternalCalling)
{
SCRIPT_START
" \
extern void external_callee(int, int); \
external_callee(1,2); \
"
SCRIPT_END
}
NAP_EXPORTS
void external_callee(nap_int_t a, nap_int_t b)
{
fprintf(stderr, "\na=%"PRINT_d", b=%"PRINT_d"\n", a, b);
if(a != 1 || b != 2) FAIL();
}
不介意SCRIPT_START
和SCRIPT_END
宏,它们只是创建/销毁脚本语言对象( NAP_EXPORTS
定义为extern "C"
以便动态库加载器可以解析名称)。
如您所见,脚本定义了一个外部方法(来自主机应用程序),然后调用它。 现在我确信该方法被调用,因为我可以在stderr /输出上看到a
和b
的值但是是的...这有手动测试的感觉:)我怎样才能使用google测试框架来确保该方法实际上是在不必看屏幕的情况下调用的? (我想避免使用hackish解决方案,比如使用全球旗帜......)
你真正想做的就是模仿这个功能。
看看像google-mock这样的模拟框架。
EXPECT_CALL
宏允许您指定呼叫发生(使用参数过滤)。
另请参阅此SO问题如何创建C trampolins以隐藏C代码背后的C ++接口。
如果你也想要一个真实的结果你也可能对invoke
函数感兴趣,它允许你将参数转发给一个真正的实现。
谷歌模拟食谱有上面所有使用模式的食谱。
以下是一些想法,从最少到最阴险:
FILE*
参数添加到external_callee()
并在那里写入而不是硬编码stderr
。 然后你的测试工具可以将它连接到一个临时文件或更高级的东西。 FILE*
。 将其默认为stderr
但让测试工具更改它。 基本上像以前的想法,但没有修改签名。 printf()
。 是的,你可以这样做 - 试试吧! 只需使用相同的签名自己定义printf()
,就应该调用它。 然后你可以做任何你想做的事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.