是否有像expect_no_warnings()那样的测试?

时间:2014-02-25 02:15:55

标签: r testthat

我正在编写一个函数测试,在某些条件下会产生警告。我想确保在其他条件下它不会产生警告。我没有看到使用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 个答案:

答案 0 :(得分:17)

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

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

来自expect_error

的文档
  

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

因此,您可以测试没有消息,错误和输出。

答案 1 :(得分:11)

在最近的testthat版本中,你可以做到:

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

答案 2 :(得分:1)

更新:现在使用expect_silent()因为expect_that已被弃用,请参阅该功能的帮助!

更新2:正如@eaglefreeman the answer using expect_warning with the param regexp set to NA所提到的那样,这是最好的解决方案,因为我的回答导致测试失败,即使没有发出警告但是只打印了一条消息。这不是OP想要的(但只是忽略警告)。我不删除这个答案,以便让其他读者明白这一点。

从帮助示例中:

expect_silent("123")

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

expect_silent(f())

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

答案 3 :(得分:1)

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

expect_failure(expect_warning(my.func()))