Модуль Тестирование кода С++ в пространстве имен
Я работаю над процедурным проектом 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
и ваши тесты могут включать этот внутренний заголовок, но ваши клиенты не являются. Таким образом, вы можете полностью протестировать свою внутреннюю реализацию, не протекая ее клиентам.