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

