У меня проблема с 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
.
Обновление: Я добавил еще дополнительных выводов сборки для помощи сдиагноз