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

如何在testthat中全局模拟被多函数调用的通用函数?

全局模拟被多函数调用的generic_function方案

当然可以实现全局模拟,不用在每个测试文件里重复写stub代码,下面是两种可行的方法:

方法1:利用testthat的全局setup文件

testthat会自动执行tests/testthat/setup.R文件(如果存在),所有测试文件运行前都会加载这个文件里的代码。你可以在这里直接替换generic_function为mock版本:

# tests/testthat/setup.R
# 替换为简单的mock返回值
generic_function <- function() TRUE

# 如果需要更复杂的mock(比如记录调用次数),可以用mockery的mock函数
generic_function <- mockery::mock(TRUE)

这样所有测试文件中的function_A、function_B调用generic_function时,都会直接使用这个mock版本,无需在每个测试文件中单独stub。

方法2:全局替换+测试后恢复原函数

如果担心全局替换会影响其他测试场景,可以在setup中保存原函数,测试结束后自动恢复:

# tests/testthat/setup.R
# 保存原函数(注意替换成你的包名)
pkg_env <- asNamespace("your_package_name")
original_generic <- get("generic_function", envir = pkg_env)

# 替换为mock版本
assign("generic_function", function() TRUE, envir = pkg_env)

# 所有测试结束后恢复原函数
testthat::teardown({
  assign("generic_function", original_generic, envir = pkg_env)
})

注意事项

  • 如果不同测试文件需要generic_function返回不同的值或者有不同的mock行为,全局模拟就不适用了,这种情况还是得在对应测试文件中单独stub
  • 全局模拟仅适合所有测试场景对generic_function的mock需求一致的情况,能大幅减少重复代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:55:02