Модуль Тестирование кода С++ в пространстве имен

Я работаю над процедурным проектом C/С++. Открытый интерфейс состоит из 4 функций, каждый из которых имеет довольно сложные задачи. Есть вспомогательные функции, объявленные в том же файле cpp, в неназванном пространстве имен. Используемая тестовая структура - GTest.

Однако некоторые из этих вспомогательных функций становятся достаточно сложными, чтобы требовать их собственного модульного тестирования. Как правило, я бы реорганизовал эти помощники в свои собственные тестируемые единицы, но требования к проекту говорят, что все должно быть в одном cpp, и только указанные функции могут быть общедоступными.

Можно ли использовать unit test вспомогательные функции при минимизации связи и как можно ближе к проектным требованиям?

Возможным решением было использовать макрос, чтобы превратить пространство имен в именованное для тестирования и неназванное для производства. Тем не менее, это выглядело немного грязнее, чем хотелось бы.

Ответ 1

Оба определения и объявления в анонимном namespace видны только внутри одной единицы перевода.

Есть два подхода, которые вы можете использовать для unit test этих частных функций.

Вы можете #include проверить весь файл .cpp в вашем файле _test.cpp. (#include ing .cpp файлы не являются хорошим способом повторного использования кода - вы не должны делать это в производственном коде!)

Возможно, лучший подход заключается в перемещении частного кода в foo::internal namespace, где foo - это namespace, который обычно использует ваш проект, и помещает частные объявления в файл -internal.h. Ваши файлы .cpp и ваши тесты могут включать этот внутренний заголовок, но ваши клиенты не являются. Таким образом, вы можете полностью протестировать свою внутреннюю реализацию, не протекая ее клиентам.