0

我们正在模拟我们的代码,但是由于模拟的标头包括包含其他几个文件的原始标头,因此我们难以消除模拟文件包含的其他文件的依赖关系。我们得到的错误如下:

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,它就是包括 pressure_service.h 并且由于我们包括 pressure_service.h ,它试图包括 ble_service.h 然后向上包含原始 SDK 的 c 文件的层次结构未编译,但必须包含头文件

我们如何阻止 Cmock 包含 pressure_service.h?

请协助我相信这是一个普遍的问题,这是人们使用 CMOCK 的全部目的,但我们似乎无法找到解决方案。

4

1 回答 1

0

简短的回答:

AFAIK CMOCK 没有选项可以关闭模​​拟 C 模块的任何包含。只能指定其他包含。

根据您的包含目录结构,您可以尝试用pressure_service.h原始标题的精简副本替换阻塞标题(在您的示例中),这将任何额外的依赖项减少到最低限度。

长答案:

恕我直言,您在这里面临的不是 CMOCK 的一般问题,而是您试图模拟的模块的设计问题。C 模块的头文件应仅包含该模块的公共接口所需的其他头文件,这是一种久经考验的做法。典型的依赖关系是类型定义,用于接口函数的参数和/或返回值。由于模拟模块意味着提供指定接口的假实现,因此 CMOCK需要将所有原始包含复制到模拟实现中,以使其编译。

这个问题通常可以通过减少原始标头(要模拟的标头)的依赖关系来解决,这通常会导致更好的软件架构。但是,如果要模拟的模块来自第三方库,这通常是遥不可及的。在这种情况下,一种解决方法是复制原始标题并将其剥离到单元测试所需的最低功能。当然,这意味着对原始界面的任何更改都需要稍后手动转移到剥离副本。但是,对于稳定的第三方模块,这应该不是什么大问题。

于 2018-06-08T07:26:14.650 回答