0

我正在使用包中的test_dir()函数在 R 中运行测试testthat。在一些测试脚本中,有调用 的函数,readline()在交互模式下,它会导致测试暂停并等待用户输入。调用的函数readline()不是我自己的,我对它们没有任何影响。用户输入与这些功能的输出无关。

有没有办法在测试期间避免这些暂停?

想到的方法,但我不知道如何实现它们:

  • 在 R 运行时禁用交互模式
  • 使用testthat包中的另一个以非交互模式运行脚本的函数
  • 以某种方式转移stdin到终端以外的其他东西(??)
  • 包装readline()在另一个脚本中调用的函数,该脚本在我的测试脚本中以非交互模式调用,并使结果可用

仅使用命令行进行测试Rscript是一种选择,但我宁愿留在 RStudio 工作流程中。

======

示例代码

with_pause <- function () {  
  readline() 
  2
}
without_pause <- function () {
  2
}
expect_equal(with_pause(), without_pause())
4

1 回答 1

1

我有一个类似的问题。我用全局选项设置解决了这个问题。

original_test_mode <- getOption('my_package.test_mode')
options('my_package.test_mode' = TRUE)
# ... some tests ...
options('my_package.test_mode' = original_test_mode)

在我的脚本中,我有一个if声明

if(getOption('my_package.test_mode', FALSE)) {
  # This happens in test mode
  my_value <- 5
} else {
  # normal processing
  my_value <- readline('please write value: ')
}

也不是最好的方法,但它对我有用。

也许还有一个提示。碰巧我的测试脚本失败了。这里的问题是,全局选项保持不变TRUE,并且在下一轮以及在同一会话中执行脚本时,它永远不会提示您写入值。我想我应该把一些东西放在一个tryCatch函数中。但是,如果您考虑到这个问题,那么“有时”会有所options('my_package.test_mode', NULL)帮助:-)

于 2016-09-19T06:14:48.713 回答