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

R语言使用gh包时如何mock API请求实现无认证离线测试

无法捕获gh包请求的核心原因

httptest2的请求捕获逻辑仅对基于httr2发起的HTTP请求生效,版本低于1.4.0的gh包底层直接调用curl发送请求,不会经过httr2的请求链路,因此无法被httptest2识别,自然不会生成预期的mock存储目录。

可落地的配置步骤
  • 升级依赖版本
    先将gh包升级到底层切换为httr2的最新版本,执行命令:
    install.packages("gh")
    
    升级完成后可通过packageVersion("gh")确认版本号≥1.4.0。
  • 首次录制mock请求
    第一次生成mock文件时,需要在联网、已配置有效GITHUB_PAT的环境下运行测试,建议显式指定mock目录的相对测试路径、开启全量录制模式,参考代码:
    httptest2::with_mock_dir(
      testthat::test_path("gh_mocks"),
      {
        test_that("api request works normally", {
          repo_info <- gh::gh("GET /repos/r-lib/gh")
          expect_equal(repo_info$full_name, "r-lib/gh")
        })
      },
      record = "all"
    )
    
    代码中testthat::test_path("gh_mocks")可以确保mock目录统一生成在tests/testthat/gh_mocks路径下,避免相对路径解析错误导致找不到生成位置。
  • 离线测试验证
    首次运行完成后,检查上述路径下是否生成了对应API路径的mock响应文件。后续运行测试时,httptest2会自动拦截匹配的请求,直接返回本地存储的mock结果,不需要联网、也不需要配置GitHub身份凭证即可完成测试。
注意事项

如果升级后仍无法捕获请求,可在测试代码开头显式加载httr2包,排查是否有其他HTTP拦截类包冲突。编写测试断言时尽量避免对动态变化的字段(比如仓库更新时间、实时star数)做精确匹配,防止mock返回值和预期断言不一致导致测试失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:18:21