CMockery Mock, Duplicate Symbol Error - PullRequest
       33

CMockery Mock, Duplicate Symbol Error

0 голосов
/ 18 декабря 2011

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

Реализация кода довольно длинная, , поэтому он в Gist здесь .

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 : Является ли ошибкой связывать мои тесты со всей моей библиотекой, я 'm, используя CMake, и строку target_link_libraries(libwatcheditTest watchedit) в моего теста CMakeLists.txt.

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

1 Ответ

0 голосов
/ 26 сентября 2012

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

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

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

...