c - 定义测试替身时如何避免多重定义

标签 c unit-testing embedded

我是单元测试的新手,我正在尝试为我想要定义的函数定义一个测试替身。它可能没有太大区别,但我将 IAR 用于 Cortex ARM M3 以及附带的编译器。

在我尝试测试的函数中,我调用了一个通过串行接口(interface)发送消息的函数。 这是一些伪代码来说明我想要完成的任务:

#ifdef UNIT_TEST
#include "MessageController.h"
#else
#include "FakeMessageController.h"
#endif

uint8 FunctionToTest(....)
{
  uint8 data[100];
  uint8 error;

  //Prepare data to send here
  SendMessage(data);

  if (error)  return 1;
  else return 0;
}

我创建了包含 SendMessage 函数的原始文件的副本,并在另一个文件中对其进行了修改。我以为我可以更改通过 #ifdef 语句调用的函数,但事实并非如此。

对于多个定义,我收到以下错误

Error[Li006]: duplicate definitions for .... ; in "......\Tests\Debug\Obj\MessageController.o", and "....\dvlp\Debug\Tests\Debug\Obj\FakeMessageController.o"

我完全理解链接器给出此错误的原因,但是有解决此问题的方法吗?或者某种欺骗链接器使用正确函数的方法? 我无法修改测试函数,因为它是我项目中原始文件的链接。

最佳答案

感谢您的帮助。我找到了自己的解决方案。

我用 #ifndef 将所有代码包装在 MessageController.c 中

#ifndef UNIT_TEST
// All the code in the MessageController.c
#endif

在 MessageController.h 中,我使用了这个技巧:

#ifdef UNIT_TEST
#include "FakeMessageController.h"
#else

// original header content

#endif

在我看来,这不是最干净的,但它对我有用。

关于c - 定义测试替身时如何避免多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37031697/

相关文章:

c - K&R 练习 1-23

c - 从 *gint 到 gdouble gtk

ios - 如何在 iOS 8 中测试 http 请求?

java - 使用 Mockito 模拟助手类

c++ - Jetson TK1 - 嵌入式 Linux - 如何定期中断

c - 从大型 C 库创建一个子集

c - 减少 C 结构体的 RAM 消耗

c - C中的套接字程序无法编译

c++ - 在 C/C++ 程序中使用 Grep 进行模式匹配是否可取?

php - yii phpunit 测试覆盖率 View