繁体   English   中英

谷歌测试:如何检查全局C(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_STARTSCRIPT_END宏,它们只是创建/销毁脚本语言对象( NAP_EXPORTS定义为extern "C"以便动态库加载器可以解析名称)。

如您所见,脚本定义了一个外部方法(来自主机应用程序),然后调用它。 现在我确信该方法被调用,因为我可以在stderr /输出上看到ab的值但是是的...这有手动测试的感觉:)我怎样才能使用google测试框架来确保该方法实际上是在不必看屏幕的情况下调用的? (我想避免使用hackish解决方案,比如使用全球旗帜......)

你真正想做的就是模仿这个功能。

看看像google-mock这样的模拟框架。

EXPECT_CALL宏允许您指定呼叫发生(使用参数过滤)。

另请参阅此SO问题如何创建C trampolins以隐藏C代码背后的C ++接口。

如果你也想要一个真实的结果你也可能对invoke函数感兴趣,它允许你将参数转发给一个真正的实现。

谷歌模拟食谱有上面所有使用模式的食谱。

以下是一些想法,从最少到最阴险:

  1. 使函数返回一个字符串而不是在内部打印它。 或至少返回一些东西。
  2. 将(可选) FILE*参数添加到external_callee()并在那里写入而不是硬编码stderr 然后你的测试工具可以将它连接到一个临时文件或更高级的东西。
  3. 创建一个全局变量,即要写入的FILE* 将其默认为stderr但让测试工具更改它。 基本上像以前的想法,但没有修改签名。
  4. 让测试工具将stderr文件描述符重新打开为管道。 调用该函数,然后尝试从该管道读取。
  5. 在测试程序中覆盖printf() 是的,你可以这样做 - 试试吧! 只需使用相同的签名自己定义printf() ,就应该调用它。 然后你可以做任何你想做的事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM