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

如何用testthat测试R包中嵌套在函数内的内部函数g?

可以在不暴露内部函数g到全局环境的前提下测试它

下面提供两种实用方法:

方法1:直接提取并执行g的定义代码

通过解析函数f的函数体,提取出内部函数g的定义语句,然后在f的环境中执行该语句,即可获取g的函数对象用于测试,全程不会污染全局环境:

test_that("内部函数g的功能验证", {
  # 从f的函数体中提取g的定义语句
  g_def <- body(f)[[2]]
  # 在f的环境中执行定义,得到g函数(仅在当前测试函数的局部环境中存在)
  eval(g_def, environment(f))
  
  # 测试g的逻辑
  expect_equal(g(2), 3)
  expect_equal(g(5), 6)
  expect_equal(g(-1), 0)
})

方法2:利用trace捕获执行时的g

通过trace函数追踪f的执行过程,在g被定义后将其捕获,测试完成后取消追踪,同样不会暴露g到全局:

test_that("内部函数g的功能验证", {
  captured_g <- NULL
  
  # 追踪f的第2行(g定义完成后的位置),将g赋值给captured_g
  trace(f, at = 2, quote(captured_g <<- g), print = FALSE)
  # 调用f触发追踪逻辑,此时captured_g会被赋值为g函数
  f(0)
  # 取消追踪
  untrace(f)
  
  # 测试捕获到的g
  expect_equal(captured_g(2), 3)
  expect_equal(captured_g(10), 11)
})

这两种方法都不需要修改原函数f的结构,也不会将g暴露到全局环境,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:23:22