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

