【发布时间】:2022-10-20 11:08:17
【问题描述】:
我有一个没有测试的 C 库A,我正在尝试为其函数funC 添加测试:
在funC 中未在A/lib.h 中声明,而仅在A/lib.c 中声明:
static int funC();
static int funC(){
// do something
}
我在test/A.t.cpp 中创建了一个测试文件,并想访问 funC 来测试它。 funC 仅在 .c 文件中声明,因此我决定使用extern C。在test/A.t.cpp 我有:
extern "C"{
static int funC();
}
TEST(A,test){
funC();
.....
}
我认为使用 .t.cpp 文件中的声明,它将能够链接到 .c 文件中的实际实现,因此我应该能够调用该函数并对其进行测试,但我得到了:
Error: The function funC() has not had a body defined
我该如何解决?然后我还尝试在测试文件中添加实现并且它有效,但这不是我想要的。我希望 .t.cpp 文件链接到 .c 文件中的实际实现。谢谢!
【问题讨论】:
-
static函数不是可见的在他们的编译单元之外......就是这样静止的方法... -
@dbush 提供了一种可能性.... 或者,您可以“暂时”注释掉“静态”关键字,以便其他代码模块可以看到该功能.... 或者,您可以使用
#ifdef隐藏无趣的功能并在同一个源文件中编写 C 测试代码。或者您可以调用该模块中依赖于该静态(辅助)函数的函数......许多测试方法...... -
一个微妙的考虑单独测试静态函数时的考虑是您将绕过任何保护由使用静态函数的函数提供。编码人员可能没有费心去防御空指针、被零除或求负数的平方根,因为其他函数已经排除了将那种坏数据传递给静态函数的可能性……这不仅仅是推动的问题它直到它破裂......它可能是静态的......
-
按照 dbush 的建议,您可以创建一个包含
A/lib.c的文件wrapper.c,然后提供一个调用funcC的函数,例如int funcC_wrapper() { return funcC(); }。然后测试代码调用funcC_wrapper()。
标签: c++ c unit-testing googletest extern