r - 环境问题使用 testthat
问题描述
我对当前在我的单元测试中表现出来的环境有一些微妙的问题。我的基本结构是这样的
- 我有一个
main
有很多参数的主函数 wrapper
是一个包装函数(其中一个),仅与main
helper
是所有包装函数都使用的中间辅助函数
我使用eval
andmatch.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
(ie parent.frame()
) 使用的默认环境,但我不知道该怎么做。
解决方案
您想在父环境而不是本地函数环境中评估您的调用。将您的助手更改为
helper <- function(fun_call) {
fun_call[[1]] <- quote(main)
fun_call <- as.call(fun_call)
fun_eval <- eval.parent(fun_call, n=2)
return(fun_eval)
}
这是假设helper
总是在wrapper
其中调用从其他地方调用的参数被定义。
在这种情况下,不清楚您是否真的需要所有这些非标准评估。您也可以考虑类似的解决方案
wrapper <- function(a, b) {
helper(mget(ls()))
}
helper <- function(params) {
do.call("main", params)
}
这里wrapper
只是将它的所有参数值捆绑到一个列表中。然后您可以将参数列表传递给helper
并将do.call
该列表作为参数传递给您的main
函数。这将评估wrapper
您调用它时的参数,您不必担心执行环境。
推荐阅读
- python - 在熊猫中使用多个键索引 groupby 对象
- kubernetes - Kubernetes API 健康检查失败
- google-sheets - 忽略隐藏列的公式
- reactjs - 如何将 Jitsi-Meet 与 reactjs web 集成
- rest - 具有先决条件数据的模块的自动化方法
- c# - 多线程中,C#调用C++DLL函数报错
- c# - asp.net 核心:未触发 IApplicationLifetime.ApplicationStopping
- powershell - 用双引号替换逗号,但不要用双引号括起来的逗号
- c# - 在 Word 2016 中更改字体后未获取最新字体名称
- python - 如何在python上编写将jpeg转换为png?