Ошибки компоновщика при попытке использовать общую тестовую группу TEST_GROUP_BASE при тестировании устаревшего кода C

Мы попытались уменьшить дублирование кода с помощью TEST_GROUP_BASE для создания общего базового класса. Когда мы пытаемся использовать этот TEST_GROUP_BASE в более чем одном тестовом классе, мы получаем предупреждения компоновщика с жалобами на 'getwchar' и 'putwchar': несогласованная связь dll и ошибки, сообщающие о множественных определениях обеих этих функций, а также ряд других 'char'/ пары 'wchar' (например, strchr/wcschr, strpbrk/wcspbrk). Если я включу только один тестовый файл, использующий макрос TEST_GROUP_BASE, ошибки компоновщика не появятся.

Базовый класс определяется как TEST_BASE в файле.h со всеми встроенными функциями-членами. Этот файл.h затем включается в производные тестовые файлы с помощью макроса TEST_GROUP_BASE, используемого для включения общего TEST_BASE. Я что-то пропустил?

Мне не удалось найти какие-либо примеры использования TEST_GROUP_BASE, поэтому я не уверен, пропустил ли я критическую часть конфигурации. Мы тестируем унаследованный код C, но все ссылки на производственный код делаются в внешних скобках "C", поскольку наши простые тесты проходят, что позволяет предположить, что c/ C++ связывается нормально.

Может кто-нибудь предложить какие-либо возможные причины, или указать мне в направлении любых примеров с открытым исходным кодом того, как TEST_GROUP_BASE используется в другом месте?

Среда разработки VS2010.

1 ответ

Я не совсем уверен, почему есть ошибки в putwchar и getwchar, которые, вероятно, не связаны с TEST_BASE AND TEST_GROUP_BASE, но, вероятно, связаны с тем, что они встроены, а файл заголовка включен с различными ссылками. Без примера кода было бы трудно выяснить, откуда возникают различные проблемы со связыванием, особенно если учесть, что он работает только с одним TEST_GROUP_BASE.

Вероятно, лучший способ решить эту проблему - не помещать все функции TEST_BASE в заголовочный файл. Макрос TEST_BASE на самом деле является очень простой заменой для "struct testBaseClass: public Utest". Таким образом, TEST_BASE - это просто любой класс, подклассифицированный из Utest. Это означает, что вы можете просто поместить реализацию в файл cpp.

Одна из причин, по которой вы не можете найти широкое применение TEST_GROUP_BASE, заключается в том, что многие люди (включая меня) рекомендуют не использовать его. Часто более гибко помещать части, которые вы хотите повторно использовать, в отдельный класс и использовать (а не наследовать) этот класс в вашем TEST_GROUP. Это позволяет использовать множество небольших классов "фикстур", которые можно повторно использовать в различных тестах.

Надеюсь это поможет.

Другие вопросы по тегам