在R包中测试与用户的交互

Kot*_*ori 3 r readline testthat r-package

我正在开发一个R包,其中一个功能是通过的标准输入来实现与用户的交互readline。我现在想知道如何测试此功能的行为,最好是使用testthat库。

似乎test_that函数假定答案是""用户输入的。我希望我可以测试用户可以输入的各种答案的行为条件。

下面是一个小的示例代码。在实际开发中,该marryme函数在单独的文件中定义,并导出到名称空间。 devtools::test()在最后一行让我出错,因为答案永远不会是。我想测试用户输入时函数是否正确返回true "y"

library(testthat)

test_that("input", {
  marryme <- function() {
    ans <- readline("will you marry me? (y/n) > ")
    return(ans == "y")
  }

  expect_false(marryme())  # this is good
  expect_true(marryme())   # this is no good
})
Run Code Online (Sandbox Code Playgroud)

ZNK*_*ZNK 6

将readLines()与自定义连接一起使用

通过使用readLines()代替readline(),您可以定义连接,使用全局选项可以自定义连接。

您需要执行两个步骤:

  1. 在包中设置一个默认选项zzz.R,指向stdin:

    .onAttach <- function(libname, pkgname){
      options(mypkg.connection = stdin())
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的功能中,更改readlinereadLines(n = 1)并将连接设置readLines()getOption("mypkg.connection")

根据您的MWE:


.onAttach <- function(libname, pkgname){
  options(mypkg.connection = stdin())
}
Run Code Online (Sandbox Code Playgroud)