Было бы совершенно логично написать отдельный модульный тест на совпадение, потому что это довольно нетривиально.
Код, который вы показали, match
является довольно тривиальным 1-строчным без каких-либо хитрых краевых случаев, или это похоже на упрощенный пример? Во всяком случае, я предполагаю, что это упрощено ...
Вопрос: какой смысл помещать функции и константы в анонимное пространство имен, если это делает их непригодными для использования в тестах?
Этот вопрос - то, что хотело заставить меня прыгнуть сюда, так как Deduplicator уже показал совершенно хороший способ взломать и получить доступ через #include
обман. Но формулировка здесь звучит так, как будто тестирование каждой внутренней детали реализации всего является своего рода универсальной конечной целью, когда она далека от этого.
Цель даже модульного тестирования не всегда состоит в том, чтобы протестировать каждый маленький гранулированный внутренний микроблок функциональности. Тот же вопрос относится к статическим функциям файловой области видимости в C. Вы можете даже сделать вопрос труднее ответить, спрашивая , почему разработчики используют pimpls
в C ++ , который потребует как friendship
и #include
фокусы в белой коробке, торгуясь легко тестируемости детали реализации для улучшения времени компиляции, например
С прагматической точки зрения это может показаться грубым, но match
может быть неправильно реализовано в некоторых крайних случаях, которые приводят к его сбою. Однако, если единственный внешний класс, Foo
который имеет доступ к нему, match
не может использовать его таким образом, чтобы он сталкивался с этими граничными случаями, то это довольно не имеет значения для правильности того, Foo
что match
эти граничные случаи никогда не встретятся, если не произойдут Foo
изменения, и в этот момент испытания Foo
не пройдут, и мы сразу узнаем.
Более навязчивый образ мыслей, жаждущий проверить каждую внутреннюю деталь реализации (возможно, критически важное программное обеспечение, например), может захотеть вмешаться и повеселиться, но многие люди не обязательно думают, что это лучшая идея, так как это создаст самые хрупкие испытания, которые только можно представить. YMMV. Но я просто хотел обратиться к формулировке этого вопроса, которая звучит так, как будто такая тестируемость на уровне мелких деталей должна быть конечной целью, когда даже самый строгий подход к юнит-тестированию может немного расслабиться. и избегайте рентгеновских снимков каждого класса.
Итак, почему люди определяют функции в анонимных пространствах имен в C ++ или как статические функции в области файлов с внутренней связью в C, скрытые от внешнего мира? И это в основном так: скрывать их от внешнего мира. Это имеет ряд последствий от сокращения времени компиляции до уменьшения сложности (то, что не доступно в другом месте, не может вызвать проблемы в другом месте) и так далее. Вероятно, проверяемость деталей частной / внутренней реализации не является первоочередной задачей для людей, когда они делают это, скажем, сокращая время сборки и скрывая ненужную сложность от внешнего мира.
foo.cpp
, а не заголовок! OP, кажется, прекрасно понимает, что не следует помещать анонимные пространства имен в заголовок.