C++ 单元测试C++;未命名命名空间中的代码

C++ 单元测试C++;未命名命名空间中的代码,c++,unit-testing,googletest,C++,Unit Testing,Googletest,我正在从事一个程序化的C/C++项目。公共界面由4个功能组成,每个功能都有相当复杂的任务。在相同的cpp文件中,在未命名的命名空间中声明了一些帮助函数。所使用的测试框架是GTest 然而,其中一些辅助函数变得足够复杂,需要自己进行单元测试。通常,我会将这些助手重构为它们自己的可测试单元,但是项目需求说明所有内容都需要在一个cpp中,并且只有指定的函数可以公开显示 有没有一种方法可以在最小化耦合的同时对助手函数进行单元测试,并尽可能地遵循项目需求 我有一个可能的解决方案,就是使用一个宏将名称空间转

我正在从事一个程序化的C/C++项目。公共界面由4个功能组成,每个功能都有相当复杂的任务。在相同的
cpp
文件中,在未命名的命名空间中声明了一些帮助函数。所使用的测试框架是GTest

然而,其中一些辅助函数变得足够复杂,需要自己进行单元测试。通常,我会将这些助手重构为它们自己的可测试单元,但是项目需求说明所有内容都需要在一个
cpp
中,并且只有指定的函数可以公开显示

有没有一种方法可以在最小化耦合的同时对助手函数进行单元测试,并尽可能地遵循项目需求


我有一个可能的解决方案,就是使用一个宏将名称空间转换成一个用于测试的命名名称空间,并将其转换为用于生产的未命名名称空间。然而,这似乎比我想象的要混乱一些。

匿名
命名空间中的定义和声明都只能在同一个翻译单元中看到

有两种方法可以对这些私有函数进行单元测试

您可以在
\u test.cpp
文件中包含正在测试的整个
.cpp
文件。(
#include
ing
.cpp
文件不是重用代码的好方法-您不应该在生产代码中这样做!)


也许更好的方法是将私有代码移动到
foo::internal
名称空间
,其中
foo
是项目通常使用的
名称空间
,并将私有声明放在
-internal.h
文件中。您的产品
.cpp
文件和测试允许包含此内部标头,但您的客户端不允许。通过这种方式,您可以完全测试内部实现,而不会将其泄漏给客户端。

对于第二种方法,将对象移动到命名命名空间意味着它将保留可引用的运行时标识,而且它似乎消除了使用匿名名称空间的理由——完全禁止从编译单元之外进行任何访问……而且它似乎允许意外的名称冲突……就像您的第一个想法一样。不知道是否有人会因为我这样做而开枪。可能是