CMockery Mock, Duplicate Symbol Error

У меня проблема с макетами CMockery, что появляются предупреждения о дублировании символов.

Реализация кода довольно длинная, так что она в Gist здесь.

Суть включает в себя тест (.c), реализация (.c) и заголовочный файл, проект строится с CMake и проверено с CTest, с помощью CMockery,

Фактическая ошибка:

ld: duplicate symbol _wit_configuration_file_path in ../libwatchedit.a(configuration.c.o) and CMakeFiles/libwatcheditTest.dir/configuration_test.c.o for architecture x86_64

Обходной путь, который я смог придумать, был объявить char *wit_configuration_file_path() как static, Поскольку реализация находится в том же файле, что и реализация int wit_load_configuration(wit_configuration config) Я ожидал, что это сработает, на самом деле он компилируется и связывается чисто. К сожалению, хотя и, вероятно, как побочный эффект объявления wit_configuration_file_path() как статический, он никогда не использует макет.

Примеры Google для cmockery слишком придуманы, и не объяснить, как с этим бороться.

Также возможно, что было бы умнее и проще протестировать объявление функции не как:

int wit_load_configuration(wit_configuration config);

а скорее как:

int wit_load_configuration(char* filepath, wit_configuration, config);

В этом случае мне не нужно что-то издеваться или заглушать; но я верю, что проблема вернется, чтобы укусить меня, так как я ожидаю, что мне нужно будет что-то высмеивать в будущем (иначе как можно написать всесторонние юнит-тесты?)

1: Как я должен сделать это правильно, static означает, что он никогда не использует мой макет, объявив его без static вызывает повторяющиеся ошибки символов.

2: я должен изменить дизайн моего API? Это будет работать для этого случая, но я хотел бы знать, как правильно смоделировать функцию.

3: ошибочно ли связывать мои тесты со всей моей библиотекой, я использую CMake и строку target_link_libraries(libwatcheditTest watchedit) в моем тестеCMakeLists.txt,

Обновление: я добавил еще несколько результатов сборки для помощи в диагностике

1 ответ

Решение

Вы пытаетесь смоделировать * wit_configuration_file_path * с тем же исходным файлом, что и тестируемая функция * wit_load_configuration *. Это невозможно. Компоновщик видит оригинальную реализацию wit_configuration_file_path, а также проверенную версию.

У CMockery довольно узкие рамки для насмешек. В конце концов, вы можете только макетировать полные исходные файлы. Если две функции находятся в одном и том же исходном файле, они либо отключены, либо находятся в "тестируемой системе".

Что делать в этом случае? Не копируйте * wit_configuration_file_path * и не размещайте его в другом исходном файле. Так как * wit_load_configuration * и * wit_configuration_file_path * очень тесно связаны, вероятно, лучшим решением будет не насмешка над функцией.

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