test_that 和 readline() 的 R 包代码覆盖率

R package code coverage with test_that and readline()

早上好, 我正在构建一个 R 包并尝试尽可能高地获得代码覆盖率(通过 codecov)。但是,当函数需要通过 readline() 输入时,我很难使用 test_that。这是一个以与我的类似的方式使用 readline() 的简化函数。

fun<-function(){
  y<-as.numeric(readline((prompt="Enter a number: ")))
  res<-2*y
  res
}

有什么方法可以将 test_that() 与此函数一起使用,而无需在每次运行时手动输入数字?比如,设置一个默认的输入号码只为测试?

谢谢!

来自?readline()

This [function] can only be used in an interactive session.

在这种情况下,我可能会将我的函数重写为如下内容:

fun <- function(y = readline(prompt = "Enter a number: ")) {
  y <- as.numeric(y)
  res <- 2 * y
  res
}

当以交互方式使用时,它的工作原理是一样的,但是当您想测试该功能时,您可以通过编程方式进行,例如:


expect_equal(
  fun(y = 10),
  20
)

其他替代方法是在您的包中包含一些选项或一个环境变量,告诉您的代码您处于测试模式,并改变 fun() 的行为。参见例如this answer 在 SO.