[英]Environmental problems using testthat
我對當前在我的單元測試中表現出來的環境有一些微妙的問題。 我的基本結構是這樣的
main
有許多 argumentswrapper
是一個包裝器 function(其中之一),僅適用於main
的選定 argumentshelper
是所有包裝函數使用的中間助手 function 我使用eval
和match.call()
在包裝器和主 function 之間平滑移動。 我現在的問題是我的測試在我逐行運行時有效,但不使用test_that()
。
這是一個顯示問題的 MWE。 如果您手動單步執行測試中的行,則測試通過。 但是,評估整個test_that()
塊時測試失敗,因為找不到 arguments 之一。
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()
),但我不知道該怎么做。
您想在您的父環境中評估您的調用,而不是在本地 function 環境中。 將您的助手更改為
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 是從其他定義參數的地方調用的。
在這種情況下,不清楚您是否真的需要所有這些非標准評估。 您也可以考慮類似的解決方案
wrapper <- function(a, b) {
helper(mget(ls()))
}
helper <- function(params) {
do.call("main", params)
}
這里wrapper
只是將它的所有參數值捆綁到一個列表中。 然后你可以將一個參數列表傳遞給helper
, do.call
會將該列表作為參數傳遞給你的main
function。 這將在您調用wrapper
時評估包裝器的參數,您不必擔心執行環境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.