消除模拟文件依赖

Posted

技术标签:

【中文标题】消除模拟文件依赖【英文标题】:eliminating mocked file dependencies 【发布时间】:2018-03-29 02:56:56 【问题描述】:

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

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 的全部目的,但我们似乎找不到解决方案。

【问题讨论】:

【参考方案1】:

简答:

AFAIK 没有选项让 CMOCK 取消任何包含的模拟 C 模块。只能指定附加包含。

根据您的包含目录结构,您可以尝试用原始标头的精简副本替换阻碍标头(在您的示例中为pressure_service.h),从而将任何额外的依赖关系降至最低。

长答案:

恕我直言,您在这里遇到的不是 CMOCK 的一般问题,而是您试图模拟的模块的设计问题。这是一个tried and tested practice,C 模块的头文件应该只包含该模块的 public 接口所需的更多头文件。典型的依赖关系是类型定义,用于接口函数的参数和/或返回值。由于模拟模块意味着提供指定接口的假实现,因此 CMOCK 需要将所有原始包含复制到模拟实现中,以使其编译。

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

【讨论】:

以上是关于消除模拟文件依赖的主要内容,如果未能解决你的问题,请参考以下文章

hihocoder 1039 字符串消除模拟

Codeforces879D. Teams Formation 思维+模拟

10.27 模拟赛

随机森林的REF递归特征消除法来筛选特征(python实现不依赖sklearn)

如何消除 XCode 5 / iOS 7 中的图标眩光?

[CCF CSP]201512-2 消除类游戏