Для разработки пакета я использую testthat. Я хочу проверить, отправляют ли мои функции правильные сообщения и предупреждения. Я хочу заодно протестировать результаты функций. Вот как я пытаюсь это сделать:

## R/foo.r
foo <- function() {
  message("This is a message")
  warning("This is a warning")
  "This is a result"
}

Я пишу эти тесты:

## tests/testthat/test-foo.R

test_that("foo works", {
  expect_equal(foo(), "This is a result")
  expect_message(foo(), "This is a message")
  expect_warning(foo(), "This is a warning")
})

Но теперь, когда я запускаю тесты, у меня есть следующее:

Loading testWarnMess
Testing testWarnMess
v |  OK F W S | Context
/ |   0       | foo                                                                           This is a message
v |   3   2   | foo [0.3 s]                                                                   
----------------------------------------------------------------------------------------------
Warning (test-foo.R:2:3): foo works
This is a warning
Backtrace:
 1. testthat::expect_equal(foo(), "This is a result") test-foo.R:2:2
 4. testWarnMess::foo()

Warning (test-foo.R:3:3): foo works
This is a warning
Backtrace:
 1. testthat::expect_message(foo(), "This is a message") test-foo.R:3:2
 7. testWarnMess::foo()
----------------------------------------------------------------------------------------------

== Results ===================================================================================
Duration: 0.3 s

[ FAIL 0 | WARN 2 | SKIP 0 | PASS 3 ]
This is a message

Как предотвратить появление сообщений и предупреждений в результатах теста, когда я ожидаю их появления?

0
pietrodito 9 Мар 2021 в 16:36

1 ответ

Лучший ответ

Отличный способ сделать это - использовать наречие purrr::quietly.

test_that("foo works", {
  qfoo <- purrr::quietly(foo)
  qfoo_call <- qfoo()
  expect_equal(qfoo_call$result, "This is a result")
  expect_equal(qfoo_call$message, "This is a message")
  expect_equal(qfoo_call$warning, "This is a warning")
})

0
pietrodito 19 Мар 2021 в 21:06