You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Fake Function Framework(fff) Mock模块的引用返回值?

用Fake Function Framework(FFF)伪造带指针参数的函数行为

核心思路

要在不引入queue模块的前提下控制queue_fetch()的返回值,同时通过引用设置event的值,你需要借助FFF的自定义Fake函数来完全接管queue_fetch()的行为,具体步骤如下:


步骤1:声明Fake函数

在测试文件中,先声明原函数的原型(若未包含queue模块头文件),再用FFF的宏定义Fake函数:

#include "fff.h"

// 声明原函数原型(匹配实际函数签名)
int queue_fetch(event_t* event);

// 定义Fake函数:FAKE_VALUE_FUNC(返回值类型, 函数名, 参数类型)
FAKE_VALUE_FUNC(int, queue_fetch, event_t*);

步骤2:配置Fake函数的行为

在测试用例中,通过自定义Fake函数实现对event参数的赋值,同时设置返回值:

// 自定义Fake函数,处理指针参数赋值
static int custom_queue_fetch(event_t* event) {
    // 给传入的event指针设置你需要的伪造数据
    *event = (event_t){
        .type = EVENT_TIMER,  // 示例字段,替换为你的实际字段
        .data = 0x1234        // 示例值,自定义为测试需要的内容
    };
    // 返回预设的返回值
    return queue_fetch_fake.return_val;
}

void test_sched_step_with_valid_event(void) {
    // 重置Fake函数状态(每个测试用例必做,避免用例间干扰)
    RESET_FAKE(queue_fetch);

    // 绑定自定义Fake函数到queue_fetch的Fake实现
    queue_fetch_fake.custom_fake = custom_queue_fetch;
    // 设置queue_fetch的返回值为OK
    queue_fetch_fake.return_val = OK;

    // 调用待测试的函数
    sched_step();

    // 验证Fake函数的调用情况
    ASSERT_EQ(1, queue_fetch_fake.call_count);  // 确认queue_fetch被调用1次
    // 若do_something_with也被Fake,可验证它是否收到了正确的event
    ASSERT_EQ(EVENT_TIMER, do_something_with_fake.arg0->type);
}

替代简化方案(仅验证场景)

如果不需要提前设置event,而是在调用后验证queue_fetch的参数,可直接通过FFF的参数捕获功能获取指针:

void test_sched_step_verify_event(void) {
    RESET_FAKE(queue_fetch);
    queue_fetch_fake.return_val = OK;

    sched_step();

    // 通过queue_fetch_fake.arg0获取传入的event指针,验证其值
    ASSERT_EQ(EXPECTED_EVENT_TYPE, queue_fetch_fake.arg0->type);
}

关键注意点

  • FAKE_VALUE_FUNC适用于返回非void类型的函数,若函数返回void则用FAKE_VOID_FUNC
  • RESET_FAKE必须在每个测试用例开头调用,重置调用计数、参数记录、返回值等状态
  • 自定义Fake函数可以完全控制函数逻辑,包括修改指针参数、模拟异常返回值等场景

内容的提问来源于stack exchange,提问作者fearless_fool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:55:09