测试中有类似expect_no_warnings()的东西吗?
题
我正在为一个函数编写测试,该函数在某些条件下会生成警告。我想确保在其他条件下它不会产生警告。我没有看到一种明显的方法可以轻松测试它 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()))
不隶属于 StackOverflow