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

