函数在C中嘲笑?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数在C中嘲笑?相关的知识,希望对你有一定的参考价值。

我正在编写一个单元测试来检查一些API调用。我正在使用支票来测试。我的模块是用CMake构建的(如果重要,则为idk)。

我的测试调用一个函数(我需要测试),这个函数调用另一个二进制文件。

它的简化版本看起来像这样。

/* unitTest.c */

#include "libraryAPI.h"
void letsMakeACall(void)
{
   ck_assert_eq(foo("water"), 0);
}

-- Module I am working on---
/*libraryAPI.c*/
#include "legacyLib.h"

void foo(const char *drink )    
{

    if (checkDrink(drink)!=0)
    {
       return 1;
    }else
    {
       return 0;
    }
}


----LEGACY BINARY---
/*legacyLib.c*/

static const char* expected = "water";

void checkDrink(const char *drink)
{
    if(drink == expected)
     {
        /*There are also a dozen functions being called which depend on legacy module initialisation*/
        return 0;
     }else{
        return 1;
     }
}

我想模拟来自legacyLib的响应,因为否则它会调用许多函数和中断。我最初的想法是在运行测试时添加一些ifdef条件,但它违反了指导原则。因为它基本上是一个呼叫拦截,所以我不知道它是最好的(或工作)解决方案。我可以用什么来解决它?

答案

我也不确定如何解决这个问题,我发布了一个similar question,但在某些情况下你可以做以下事情(假设你正在测试各个函数):

  1. 包含.c文件而不是标题.h,但在使用define指令“重命名”模拟函数之后: #define checkDrink checkDrink_mocked // preprocessor will now replace all occurrences of "checkDrink" // with "checkDrink_mocked" int checkDrink_mocked(const char *drink); #include "legacyLib.c" #undef checkDrink
  2. 实现重命名的功能: int checkDrink_mocked(const char *drink) { return 15; }

以上是关于函数在C中嘲笑?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化C ++代码的以下片段 - 卷中的零交叉

如何有条件地将 C 代码片段编译到我的 Perl 模块?

嘲笑无法在测试方法中调用我的方法

满足条件时是不是可以在 GLSL 着色器中回调 C/C++ 函数/代码? [关闭]

嘲笑php测试中的碳对象

关于代码片段的时间复杂度