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
相关产品推荐
相关产品推荐

