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

非包开发场景下如何使用testthat的local_mocked_bindings?

问题解答

核心结论

不将项目转为包结构的前提下,testthat::local_mocked_bindings无法直接使用——该函数的设计依赖包开发环境(需要通过pkgload加载包上下文),这也是你遇到Error in dev_package(): No packages loaded with pkgload报错的原因,调整.package参数无法绕过这个限制。

替代方案(替代已弃用的with_mock)

对于非包的Shiny项目,推荐结合testthat::mock()和rlang::local_bindings()实现函数Mock,这是适配非包场景的官方推荐方案,示例如下:

library(testthat)
library(rlang)

test_that("Shiny模块功能验证", {
  # 1. 创建模拟函数,自定义返回值或行为
  mock_my_api_call <- mock(return_value = list(data = "mocked response"))
  
  # 2. 临时将目标函数替换为模拟函数,作用域仅限当前测试用例
  local_bindings(
    my_api_call = mock_my_api_call, 
    .env = globalenv()  # 若函数在特定环境(如Shiny模块环境),替换为对应环境即可
  )
  
  # 3. 执行测试逻辑(比如调用依赖被Mock函数的Shiny模块逻辑)
  result <- run_my_shiny_module()
  
  # 4. 断言结果符合预期
  expect_equal(result$data, "mocked response")
  
  # 5. 验证模拟函数被正确调用
  expect_called(mock_my_api_call, times = 1)
})

补充说明

  • 如果项目未来计划转为包结构,迁移后即可正常使用local_mocked_bindings,只需将测试用例放在tests/testthat目录下,通过devtools::test()或testthat::test_dir()配合包加载环境运行即可。
  • 已弃用的with_mock目前仍可使用,但建议尽快迁移到上述方案,避免未来testthat版本移除该函数导致测试失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:37:41