我正在编写一个函数测试,在某些条件下会产生警告。我想确保在其他条件下它不会产生警告。我没有看到使用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())
我错过了一些明显的东西吗?
答案 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()))