Устранение зависимостей по файлу
Мы высмеиваем наш код, но у нас возникают трудности с устранением зависимости от других файлов, которые включает в себя смоделированный файл, из-за ложного заголовка, включающего исходный заголовок, который включает в себя несколько других файлов. Ошибка, которую мы получаем ниже:
In file included from ../nRF5_SDK_11.0.0_89a8197/components/softdevice/s130/headers/ble_gap.h:48:0,
from ../nRF5_SDK_11.0.0_89a8197/components/softdevice/s130/headers/ble.h:52,
from ../infrastructure/microcontroller_abstraction/ble/include/ble_service.h:4,
from ../infrastructure/system_abstraction/pressure/include/pressure_service.h:15,
from ./mocks/pressure_service_mock.h:5,
from ./mocks/pressure_service_mock.c:7:
../nRF5_SDK_11.0.0_89a8197/components/softdevice/s130/headers/ble_gap.h: In function 'sd_ble_gap_address_set':
../nRF5_SDK_11.0.0_89a8197/components/softdevice/s130/headers/nrf_svc.h:66:5: error: unknown register name 'r0' in 'asm'
__asm( \
^
Это происходит из-за следующего примера сценария: давайте возьмем пример файла давления сервиса mock.c, например, mock.c ---- включает ---> mock.h. Дело в том, что, поскольку mock.h генерируется, он включая response_service.h, и так как мы включаем в него pressure_service.h, он пытается включить ble_service.h, а затем вверх по иерархии включает файлы c исходного SDK, НЕ скомпилированные, но файлы заголовков должны быть включены
Как бы мы не позволили Cmock включить в него press_service.h?
Пожалуйста, помогите, я считаю, что это общая проблема, и в этом вся цель использования CMOCK, но мы не можем найти решение.
1 ответ
Короткий ответ:
AFAIK, у CMOCK нет возможности отклонить какие-либо включения включенного модуля C. Можно только указать дополнительные включения.
В зависимости от вашей структуры включаемых каталогов вы можете попробовать заменить заглушающий заголовок (pressure_service.h
в вашем примере) уменьшенной копией исходного заголовка, что сводит любые дополнительные зависимости к минимуму.
Длинный ответ:
ИМХО, вы сталкиваетесь здесь не с общей проблемой CMOCK, а с проблемой дизайна модуля, который вы пытаетесь смоделировать. Это проверенная и проверенная практика, что заголовок модуля C должен включать только дополнительные файлы заголовков, которые необходимы общедоступному интерфейсу этого модуля. Типичные зависимости - это определения типов, которые используются для аргументов и / или возвращаемых значений интерфейсных функций. Поскольку макетирование модуля означает предоставление поддельных реализаций указанного интерфейса, CMOCK необходимо скопировать все исходные включения в реализацию макета, чтобы сделать его компиляцией.
Эту проблему обычно можно решить, уменьшив зависимости исходного заголовка (который должен быть смоделирован), что обычно приводит к лучшей архитектуре программного обеспечения в целом. Если модуль, который нужно смоделировать, поступает из сторонней библиотеки, это обычно недоступно. В этом случае обходной путь - сделать копию исходного заголовка и сократить его до минимальной функциональности, необходимой для модульного теста. Конечно, это подразумевает, что любое изменение в исходном интерфейсе должно быть вручную перенесено на сокращенное копирование позже. В случае стабильного стороннего модуля это не должно быть большой проблемой.