在未命名的命名空间中对C++代码进行单元测试

19

我正在处理一个程序化的C/C++项目,公共接口包括4个函数,每个函数都有相当复杂的任务。在同一个cpp文件中声明了一些助手函数,它们位于一个未命名的命名空间中。使用的测试框架是GTest。

然而,一些这些助手函数变得足够复杂,需要它们自己的单元测试。通常,我会将这些助手函数重构为可测试的单元,但是项目要求所有内容都必须在同一个cpp文件中,并且只能公开指定的函数。

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

我想到的一个可能的解决方案是使用宏将命名空间用于测试,而对于生产则不使用命名空间。但是,那似乎比我想象中的要混乱一些。

2个回答

18

在匿名的命名空间中,定义和声明都只能在同一个翻译单元中可见。

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

你可以在_test.cpp文件中#include被测试的整个.cpp文件。(在实际代码中不应该这样做,因为#include引入整个.cpp文件不是重用代码的好方法!)

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


7
对于第二种方法,将对象移动到命名的命名空间意味着它将保持可引用的运行时标识,并似乎使使用匿名命名空间的原因失效 - 完全禁止来自编译单元之外的任何访问...此外还似乎允许意外名称冲突... - eonil
2
真的很喜欢你的第一个想法。不知道会不会有人因为我这样做而猛烈抨击我。 - AturSams

0
Johnsyweb很完美,但我们不需要foo::internal,只需要foo就可以了。

这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - SebastianH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接