Модульные тесты для устаревших функций в пакете R вызывают предупреждения во время проверки

Я устарел от нескольких функций в своем пакете R, включив строку .Deprecated("new_function_name") в начале функции. У меня было полное покрытие юнит-тестами для этих устаревших функций. Теперь эти тесты выдают предупреждения (из-за сообщения об устаревании) и искажают результаты testthat::test() и devtools::check()..

Я мог бы просто удалить тестовое покрытие для устаревших функций, но похоже, что пока пользователи все еще могут вызывать функции, я должен сохранить тестовое покрытие. Есть ли способ сохранить тесты, но избежать беспорядка в результате check()? Например, сказать testthat считать их пройденными, если expect_equal() все еще работает, игнорируя предупреждения об устаревании?


person Sam Firke    schedule 22.03.2017    source источник


Ответы (1)


.Deprecated выдает предупреждение. Таким образом, вы всегда можете временно сохранить вывод и обернуть его вызовом expect_warning или suppressWarnings, если вам не нужно проверять, выдает ли он предупреждение.

my_dep_fun <- function(x){
   .Deprecated("my_new_fun")
   return(x+1)
}

Используя это

> # This is what I expect you're doing right now
> expect_equal(my_dep_fun(3), 4)
Warning message:
'my_dep_fun' is deprecated.
Use 'my_new_fun' instead.
See help("Deprecated") 
> 
> # If we store and use expect_warning we don't get the warning
> expect_warning(tmp <- my_dep_fun(3))
> expect_equal(tmp, 4)
> # Alternatively...
> suppressWarnings(expect_equal(my_dep_fun(3), 4))
> 
person Dason    schedule 22.03.2017
comment
Это удовлетворяет основным целям сохранения тестов и получения чистого листа на test(). Я хотел бы поместить этот подход в функцию, чтобы я мог просто изменить свои тесты с expect_equal на expect_equal_deprecated - было бы чище для реализации вместо обновления каждого теста таким образом. Но я возился с этим и не вижу способа, так что, возможно, это лучшее, что можно сделать. - person Sam Firke; 23.03.2017