Подтвердить что ты не робот

Есть что-то в testthat, как 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())

Я пропустил что-то очевидное?

4b9b3361

Ответ 1

В более поздних версиях'testthat '(от 0.11.0) вы можете:

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

Из документации expect_error

regexp: регулярное выражение для проверки. Если опустить, просто утверждается, что код создает некоторые выходные данные, сообщения, предупреждения или ошибки. В качестве альтернативы вы можете указать NA, чтобы указать, что не должно быть никаких выходов, сообщений, предупреждений или ошибок.

Таким образом, вы можете проверить, нет ли сообщений, ошибок и результатов.

Ответ 2

В последних версиях testthat вы можете просто:

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

Ответ 3

Обновление: Используйте expect_silent() в настоящее время, потому что expect_that устарел, см. справку для функции!.

Обновление 2: Как упоминалось @eaglefreeman ответ с использованием expect_warning с параметром regexp, установленным на NA, лучшее решение, так как мой ответ заставляет тест терпеть неудачу, даже если предупреждение не было поднято, но было напечатано только сообщение aa. Это не то, чего хотел OP (но просто игнорировать предупреждения). Я не удаляю этот ответ, чтобы сделать эту разницу понятной для других читателей.

В примерах справки:

expect_silent("123")

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

expect_silent(f())

Предупреждение: expect_silent также не ожидает выхода, поэтому семантика немного отличается!

Ответ 4

Вы можете проверить, не сработает ли expect_warning(). Далее решается вопрос о том, что вопрос о выходе другого типа, выражаемый my.func() и not(), устарел:

expect_failure(expect_warning(my.func()))