我有两个函数,其中一个函数根据参数以半递归方式调用另一个函数。
f1 <- function(use_f2 = FALSE){
if (use_f2) {
f2()
}
}
f2 <- function(){
f1(use_f2 = FALSE)
}
我想跟踪根据参数调用每个函数的次数,然后将其作为使用testthat
的单元测试的一部分。
我可以跟踪使用自定义环境和trace
进行的调用次数(请参阅here了解我之前的操作),如previous SO question
function_counts <- new.env()
function_counts$f1 <- function_counts$f2 <- 0
trace(f1, tracer = quote(function_counts$f1 <- function_counts$f1 + 1), print = FALSE)
trace(f2, tracer = quote(function_counts$f2 <- function_counts$f2 + 1), print = FALSE)
f1()
function_counts$f1
function_counts$f2
这很好用,直到我添加testthat
环境的复杂性。
如果我把
count_env <- new.env()
count_env$f1 <- 0
trace(f1, tracer = quote(count_env$f1 <<- count_env$f1 + 1), print = FALSE)
在test_that
区块的外部或内部,然后在 rst>中运行devtools::test()
或 ctrl-shift-t ,在特殊环境中进行测试,我会得到count_env not found
。我意识到这是trace
和testthat
的环境之间的相互影响,但我无法解读它。
我还尝试将count_env
对象作为包本身的未导出对象,但这似乎也无效。
This repo有一个包含这两个函数的最小包,还有一个testthat
tests目录可供使用。
任何有关从哪里出发的帮助都会很棒。
答案 0 :(得分:0)
事实证明,答案是使用本地变量,以及在trace
调用中定义的本地函数。
.f1 <- .f2 <- 0
trace(f1, tracer = function() {.f1 <<- .f1 + 1}, print = FALSE)
trace(f2, tracer = function() {.f2 <<- .f2 + 1}, print = FALSE)
test_that("f1 FALSE", {
f1()
expect_equal(1, .f1)
expect_equal(0, .f2)
})
感谢Steph Locke指向使用匿名函数的示例以及初始拉取请求。