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

如何在testthat测试单元中调用其他包?寻求免library/命名空间方案

解决R包测试中无需library或命名空间前缀使用mockery的方案

要在testthat测试中直接使用mockery的函数(如stub、mock),同时避免在每个测试文件中写library(mockery)或mockery::前缀,可以通过testthat全局设置文件实现:

步骤1:创建testthat全局setup文件

在你的包的tests/testthat/目录下新建setup.R文件,用于全局配置测试环境。

方案A:导入指定mockery函数(推荐,更安全)

只导入测试需要的函数,避免污染搜索路径:

# tests/testthat/setup.R
# 导入mockery的核心函数到测试环境
testthat::local_imports(
  mockery::stub,
  mockery::mock,
  .env = testthat::test_env()
)

方案B:挂载mockery命名空间(一次性加载所有函数)

如果需要使用mockery的多个函数,可以直接挂载其命名空间:

# tests/testthat/setup.R
# 确保mockery已安装并挂载到搜索路径
if (requireNamespace("mockery", quietly = TRUE)) {
  attachNamespace("mockery")
}

步骤2:编写测试文件(无需额外加载代码)

现在你可以在测试文件中直接使用mockery的函数,比如针对你的示例代码:

# tests/testthat/test-f.R
test_that("f returns correct value when g is mocked", {
  # 直接使用stub,无需前缀或library
  stub(f, "g", function(x) x * 2)
  expect_equal(f(3), 7) # 3*2 +1 =7
})

原理说明

  • setup.R是testthat的全局初始化文件,会在所有测试执行前自动运行,确保mockery的函数提前进入测试环境的搜索路径。
  • 由于你已将mockery添加到DESCRIPTION的Suggests字段,R CMD check或devtools::test()会自动安装该依赖,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:02:48