Есть ли что-то в TestThat, как veed_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't'ttps://github.com/hadley/testthat/release/tag/v0.11.0"> 0.11.0 ) вы можетеДелать:
expect_warning(my.func(), regexp = NA)
.
из документации expect_error
Regexp: регулярное выражение для тестирования.Если пропущено, просто утверждает, что код создает некоторую вывод, MessSage, предупреждение или ошибку.Кроме того, вы можете указать Na, чтобы указать, что не должно быть вывода, сообщений, предупреждений или ошибок.
Так же, как только вы можете проверить, что нет сообщений, ошибок и вывода.
Другие советы
В последних версиях testthat вы можете просто сделать:
expect_that(my.func(), not(gives_warning()))
. expect_silent()
Noesadays, потому что expect_that
устарел, см. Справка для функции!.
expect_warning
с параметрами regexp
Набор для NA
/ a> Это лучшее решение, поскольку мой ответ приводит к неудачному тесту, даже если предупреждение не было поднято, но просто сообщение AA было напечатано.Это не то, что хотел OP (но просто игнорировать предупреждения).Я не удаляю этот ответ, чтобы понять эту разницу для других читателей.
expect_silent("123")
f <- function() {
message("Hi!")
warning("Hey!!")
print("OY!!!")
}
expect_silent(f())
.
Предупреждение: expect_silent
также не ожидает вывода, поэтому семантика немного отличается!
Вы можете проверить, не удается ли выйти expect_warning()
.Следующее решает как вопрос о других видах вывода, создаваемого генеракодицетагкодом, так и генеракодицетагкодом, имеющим устаревшие:
expect_failure(expect_warning(my.func()))
.