非包开发场景下如何使用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
相关产品推荐
相关产品推荐

