27

我正在为在某些情况下会生成警告的函数编写测试。我想确保在其他条件下它不会产生警告。我没有看到一个明显的方法来轻松测试它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())

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

4

4 回答 4

26

在“testthat”(从0.11.0 开始)的更新版本中,您可以执行以下操作:

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

从文档expect_error

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

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

于 2015-11-10T20:26:41.567 回答
11

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

expect_that(my.func(), not(gives_warning()))
于 2014-02-26T09:16:43.747 回答
4

更新:现在使用,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也期望没有输出,所以语义有点不同!

于 2016-11-13T20:17:36.263 回答
1

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

expect_failure(expect_warning(my.func()))
于 2017-09-21T14:35:16.810 回答