У меня есть некоторые деликатные проблемы со средами, которые в настоящее время проявляются в моих модульных тестах. Моя основная структура такова
- У меня есть основная функция
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()
), но я не уверен, как это сделать.