【发布时间】:2021-07-22 04:04:15
【问题描述】:
我对当前在我的单元测试中表现出来的环境有一些微妙的问题。我的基本结构是这样的
- 我有一个主函数
main,它有很多参数 -
wrapper是一个包装函数(众多函数之一),仅与main的选定参数有关 -
helper是所有包装函数都使用的中间辅助函数
我使用eval 和match.call() 在包装器和主函数之间平滑移动。 我现在的问题是,当我逐行运行测试时,我的测试工作正常,但不使用 test_that()。
这是一个显示问题的 MWE。如果您手动单步执行测试中的行,则测试通过。但是,评估整个 test_that() 块时测试失败,因为无法找到其中一个参数。
library(testthat)
wrapper <- function(a, b) {
fun_call <- as.list(match.call())
ret <- helper(fun_call)
return(ret)
}
helper <- function(fun_call) {
fun_call[[1]] <- quote(main)
fun_call <- as.call(fun_call)
fun_eval <- eval(as.call(fun_call))
return(fun_eval)
}
main <- function(a, b, c = 1) {
ret <- list(a = a, b = b, c = c)
return(ret)
}
test_that("Test", {
a <- 1
b <- 2
x <- wrapper(a = a, b = b)
y <- list(a = 1, b = 2, c = 1)
expect_equal(x, y)
})
很有信心,我怀疑我需要修改eval 使用的默认环境(即parent.frame()),但我不知道该怎么做。
【问题讨论】:
-
在包装器主体中定义帮助器可能会起作用。