我正在为一个函数编写测试,该函数在某些条件下会生成警告。我想确保在其他条件下它不会产生警告。我没有看到一种明显的方法可以轻松测试它 testthat. 。我想我可以做这样的事情:

my.result <- 25
my.func <- function() my.result
expect_equal(
  withCallingHandlers(
    my.func(), warning=function() stop("A Warning!")
  ), 
  my.result
)

或使用 options(warn=2), ,但我希望会有类似的东西:

expect_no_warnings(my.func())

我错过了一些明显的东西吗?

有帮助吗?

解决方案

在“testthat”的更新版本中(来自 0.11.0) 你可以做:

expect_warning(my.func(), regexp = NA)

从文档 expect_error

正则表达式:要测试的正则表达式。如果省略,则仅断言代码产生一些输出、消息、警告或错误。或者,您可以指定 NA 来指示不应有输出、消息、警告或错误。

因此,您可以用同样的方式测试是否没有消息、错误和输出。

其他提示

在 testthat 的最新版本中,您可以简单地执行以下操作:

expect_that(my.func(), not(gives_warning()))

更新: 使用 expect_silent() 如今因为 expect_that 已弃用,请参阅该函数的帮助!。

更新2: 正如@eaglefreeman 提到的 答案使用 expect_warning 与参数 regexp 设置 NA 是最好的解决方案,因为即使没有发出警告但只打印了一条消息,我的答案也会导致测试失败。这不是OP想要的(但只是忽略警告)。我不会删除这个答案,以使其他读者清楚地了解这种差异。

从帮助的例子来看:

expect_silent("123")

f <- function() {
  message("Hi!")
  warning("Hey!!")
  print("OY!!!")
}

expect_silent(f())

警告: expect_silent 也期望没有输出,因此语义有点不同!

您可以检查是否 expect_warning() 失败。以下解决了由产生的其他类型输出的问题 my.func()not() 已弃用:

expect_failure(expect_warning(my.func()))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top