2011-12-18 9 views
0

У меня проблема с CMockery mocks, что есть повторяющиеся предупреждения о символах.CMockery Mock, Duplicate Symbol Error

Реализация кода довольно длинная, so it's in a Gist here.

суть включает тест (.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 examples for cmockery слишком надуманный и не объясняет, как с этим бороться.

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

int wit_load_configuration(wit_configuration config); 

, а скорее как:

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

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

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

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

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

Update: Я добавил некоторые more build output here for help with diagnosis

ответ

0

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

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

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

+0

Спасибо, dmeister! Есть ли более тонкая штукатурка или библиотека для C? Я использовал CMake для сборки, для чего Make лучше подходит, и CMockery, потому что он был рекомендован CMake, но я не привязан (и отложил этот боковой проект за последние 10 месяцев)! –

+0

Нет, я не знаю. Это довольно сложно сделать с C. – dmeister

+0

Cheers dmeister! Да, насмешливость и укутывание довольно сложно, тестирование с помощью внешних инструментов для принятия немного более доступно! –

 Смежные вопросы

  • Нет связанных вопросов^_^