我是单元测试的新手,我正在尝试为我想要定义的函数定义一个测试替身。它可能没有太大区别,但我将 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/