CUnit - “模拟”libc 函数

2024-04-01

我正在使用 CUnit 进行项目单元测试。 我需要测试是否使用正确的参数调用 libc 函数以及是否以正确的方式处理它们的返回值。 例如:如果我调用 bind(...) 函数 - 我想检查我传递的 af 参数并断言如果这是错误的,并且我还想模拟它的返回值并断言如果我检查它正确的方式。

出于这些目的,我希望 CUnit 环境有一个内置机制,让我在测试时调用“模拟”bind() 函数,在运行代码时调用真正的 bind() 函数 - 但我找不到类似的东西这。

您能否告诉我 CUnit 中是否缺少某些内容,或者建议一种实现此功能的方法。

谢谢, 乔.


不幸的是,您无法使用 CUnit 模拟 C 中的函数。

但是您可以通过使用和滥用定义来实现您自己的模拟函数: 假设您在编译测试时定义了 UNITTEST,您可以在测试文件(或包含文件)中定义如下内容:

#ifdef UNITTEST
    #define bind mock_bind
#endif

在您将在测试模式下编译的mock_helper.c 文件中:

static int mock_bind_return;    // maybe a more complete struct would be usefull here
static int mock_bind_sockfd;

int mock_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
    CU_ASSERT_EQUAL(sockfd, mock_bind_sockfd);
    return mock_bind_return;
}

然后,在您的测试文件中:

extern int mock_bind_return;
extern int mock_bind_sockfd;

void test_function_with_bind(void)
{

   mock_bind_return = 0;
   mock_bind_sockfd = 5;
   function_using_bind(mock_bind_sockfd);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUnit - “模拟”libc 函数 的相关文章

  • x86 LargeAddressAware 兼容性的单元测试

    对于 win32 可执行文件 x86 我们可以设置 LargeAddressAware 标志 以便它在 x64 Windows 上运行时可以访问 4 GB 而不是仅 2 GB 的虚拟地址空间 这看起来很吸引人 然而 这也存在风险 例如参见
  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 阅读 Stack Overflow RSS 源

    我正在尝试获取未回答问题的列表the feed https stackoverflow com feeds 但我在阅读时遇到困难 const string RECENT QUESTIONS https stackoverflow com f
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • C中有const吗?

    这个问题可能很幼稚 但是 有没有constC 中的关键字 从哪个版本开始 之间有任何语义和 或句法差异吗const在 C 和 C 中 C 和 C 之间在语法上没有差异const关键字 除了一个相当晦涩的关键字 在 C 中 自 C99 起 您
  • 通过 mpi 发送 c++ std::vector

    我知道存储一个std vector
  • for 循环 - 没有效果的语句

    由于某种原因 我收到错误 statement with no effect关于这个声明 for j idx j lt iter j increment printf from loop idx i int idx punc ctxt j 你
  • 在生产者-消费者情况下使用条件变量

    我正在尝试了解条件变量以及如何在生产者 消费者情况下使用它 我有一个队列 其中一个线程将数字推入队列 而另一个线程从队列中弹出数字 当生产线程放置一些数据时 我想使用条件变量向消费线程发出信号 问题是有时 或大多数时候 它只将最多两个项目推
  • C#:如何使用 SHOpenFolderAndSelectItems [重复]

    这个问题在这里已经有答案了 有人可以举例说明如何使用 shell 函数吗SH打开文件夹并选择项目 http msdn microsoft com en us library bb762232 VS 85 aspx来自 C 我不太明白如何使用
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • 在 C# 中读取/写入命令行程序

    我正在尝试与 C 的命令行程序进行对话 它是一个情绪分析器 它的工作原理如下 CMD gt java jar analyser jar gt Starting analyser 这是我想从我的 C 程序插入内容的地方 例如 I love y
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 获取 Node.js 中的完整文件路径

    我有一个将 csv 文件上传到特定文件夹 例如 上传 的应用程序 现在我想获取该 csv 文件的完整路径 例如 D MyNodeApp uploads Test csv 如何获取 Node js 中的文件位置 我使用 multer 上传文件
  • 使用 x64 SIMD 进行半字节改组

    我知道字节改组 https www felixcloutier com x86 pshufb指令 但我想对半字节 4 位值 做同样的事情 具体来说 我想在 64 位字中混洗 16 个半字节 我的洗牌索引也存储为 16 个半字节 最有效的实施
  • 从字符串创建数组

    我需要像这样创建数组 Array firstkey gt Array secondkey gt Array nkey gt 由此 firstkey secondkey nkey yourString firstkey secondkey n
  • 有没有一种简单的方法可以将 ISO 8601 持续时间转换为 timedelta?

    我怎样才能转换ISO 8601 持续时间字符串 https en wikipedia org wiki ISO 8601 Durations to datetime timedelta https docs python org 3 lib
  • 如何通过 Antd 和 VueJS 在表格单元格中使用 customRender

    我在我的应用程序中使用 antd 并尝试执行 customRender 以在单元格中显示图像 我的列数组如下所示 columns title Design dataIndex designImage fileUrl customRender
  • 如果 IP 位于 IP 范围之间,则限制该 IP

    好的 今天是星期五下午 我度过了漫长的一周 所以希望得到一些帮助 目前 我有一个 IP 范围列表 如下所示 List
  • Visual Studio 2019 - 在 WebApp 中添加 WebJob 项目

    在我的解决方案中 我有一个 aspnet core 2 2 WebApp 我想添加一个现有项目 例如 webJob 但没有选项 从现有项目添加 WebJobs 为什么 使用相同的过程 我在其他 Net 应用程序上添加 WebJobs 此选项
  • 互斥体和 Windows Phone 8.1

    这是我的问题 Windows Phone 8 1 Visual Studio 2013 版本 4 我有一个主项目和一个每 30 分钟运行一次的后台项目 我想在两者之间传递数据 我想确保对 Windows Storage Applicatio
  • 如何在 android layout.xml 文件中创建 2 行按钮

    我尝试在 android layout xml 文件中创建 2 行按钮 第一行左对齐 第二行居中对齐 这就是我所做的 但我最终得到了一排按钮 你能告诉我我做错了什么吗 enter code here
  • 查找“IN”子句中与记录不匹配的值

    我有一个dept表与eng and finance记录 它不包含以下记录foo bar or baz 我有一个休眠查询 它返回与我要查找的内容匹配的记录 看起来像 select from dept where dept name in en
  • 布局权重在 ScrollView 中不起作用

    我想将布局权重分配给一个中的多个项目LinearLayout里面的一个ScrollView 但是 那ScrollView忽略LinearLayout weightSum 我的目标是将布局划分为权重 2 1 1 总和为 4 但这在 a 内部无
  • 在 R 中访问多个艺术家的 Spotify API

    我在 Spotify 的开发者应用程序部分创建了客户端 ID 和密钥 我正在参考这份文件 并希望通过选择多名艺术家来扩展它 https www r bloggers com the eurovision 2016 song contest
  • 使用指针交换对象

    我正在尝试为使用 void 指针交换对象的作业问题交换对象 我的函数的声明必须是 void swap void a void b size t size 我并不是在寻找如何执行此操作的确切代码 这样我就可以自己弄清楚 但我不确定我是否理解正
  • 找出3个字母的单词

    我的 Python 代码如下 import re string what are you doing you i just said hello guys regexValue re compile r s w w w s mo regex
  • R光栅绘制图像,画一个圆并掩盖圆外的像素

    下面的代码绘制一个图像 然后在该图像上绘制圆圈 我想让该圆圈之外的所有像素都变成黑色 我怎么能这么做呢 library raster library plotrix r1 lt brick system file external rlog
  • 无法安装 XML 包

    我无法安装最新的 XML 包 V3 9 4 我通过键入以下内容在 RGUI 中手动安装它 install packages LOCALDIR XML 3 6 0 tar gz repos NULL type source 但收到一些错误消息
  • Vaadin 7 在执行后台线程后不刷新 UI(仅当需要超过 5 分钟时)

    我正在使用 Vaadin 7 在我的应用程序中 有一个表格列表 用户可以选择一个或多个项目来详细说明 如果单击执行按钮 UI 组件将被禁用并启动两个线程 第一个线程执行繁重的计算 第二个线程更新 UI 上的进度指示器 使用 lock 和un
  • jest.mock express-jwt 受保护路由的中间件行为

    所以现在我有这样的东西 这不起作用 import app from src app beforeAll gt jest mock src middleware auth gt req Request res Response next Ne
  • 为什么在 initWIthCoder:(NSCoder *)aDecoder 中调用时未设置我的 UIView 图层属性?

    我构建了一个自定义 View 类 它是 UIView 的子类 该视图通过 ViewController 中的 nib 文件加载 NSBundle main loadNibNamed MyCustomView owner self optio
  • CUnit - “模拟”libc 函数

    我正在使用 CUnit 进行项目单元测试 我需要测试是否使用正确的参数调用 libc 函数以及是否以正确的方式处理它们的返回值 例如 如果我调用 bind 函数 我想检查我传递的 af 参数并断言如果这是错误的 并且我还想模拟它的返回值并断