跟踪包括testthat中的变量修改

时间:2015-12-10 17:59:15

标签: r testthat

我有两个函数,其中一个函数根据参数以半递归方式调用另一个函数。

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。我意识到这是tracetestthat的环境之间的相互影响,但我无法解读它。

我还尝试将count_env对象作为包本身的未导出对象,但这似乎也无效。

This repo有一个包含这两个函数的最小包,还有一个testthat tests目录可供使用。

任何有关从哪里出发的帮助都会很棒。

1 个答案:

答案 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指向使用匿名函数的示例以及初始拉取请求。