【问题标题】:Unit Testing C++ Code in an Unnamed Namespace在未命名的命名空间中对 C++ 代码进行单元测试
【发布时间】:2013-02-09 07:15:25
【问题描述】:

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

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

有没有一种方法可以对辅助函数进行单元测试,同时最大限度地减少耦合,并尽可能地遵循项目要求?

我有一个可能的解决方案是使用宏将命名空间变成命名空间用于测试,而未命名用于生产。但是,这似乎比我想的要混乱一些。

【问题讨论】:

标签: c++ unit-testing googletest


【解决方案1】:

匿名namespace 中的定义和声明仅在同一个翻译单元中可见。

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

您可以在您的_test.cpp 文件中#include 正在测试的整个.cpp 文件。 (#includeing .cpp 文件不是重用代码的好方法——你不应该在生产代码中这样做!)

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

【讨论】:

  • 对于第二种方法,将对象移动到命名命名空间意味着它将保持可引用的运行时标识,并且似乎取消了使用匿名命名空间的原因——完全禁止任何来自编译单元之外的访问……此外,它似乎允许意外的名称冲突......
  • 真的很喜欢你的第一个想法。想知道是否有人会因为我这样做而开枪。
最近更新 更多