簡體   English   中英

環境問題使用 testthat

[英]Environmental problems using testthat

我對當前在我的單元測試中表現出來的環境有一些微妙的問題。 我的基本結構是這樣的

  • 我有一個主要的 function main有許多 arguments
  • wrapper是一個包裝器 function(其中之一),僅適用於main的選定 arguments
  • helper是所有包裝函數使用的中間助手 function

我使用evalmatch.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只是將它的所有參數值捆綁到一個列表中。 然后你可以將一個參數列表傳遞給helperdo.call會將該列表作為參數傳遞給你的main function。 這將在您調用wrapper時評估包裝器的參數,您不必擔心執行環境。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM