¿Hay algo en la prueba que le guste expect_no_warnings()?
Pregunta
Estoy escribiendo pruebas para una función que, bajo algunas condiciones, generará advertencias.Quiero asegurarme de que en las demás condiciones no produzca advertencias.No veo una manera obvia de probar eso fácilmente con testthat
.Supongo que podría hacer algo como:
my.result <- 25
my.func <- function() my.result
expect_equal(
withCallingHandlers(
my.func(), warning=function() stop("A Warning!")
),
my.result
)
o usar options(warn=2)
, pero esperaba que hubiera algo como:
expect_no_warnings(my.func())
¿Me estoy perdiendo algo obvio?
Solución
En versiones aún más recientes de'tthat' (de 0.11.0 ) puedehacer:
expect_warning(my.func(), regexp = NA)
de la documentación del expect_error
Regexp: expresión regular para probar.Si se omite, simplemente afirma que el código produce algunos resultados, mensajes, advertencia o error.Alternativamente, puede especificar NA para indicar que no debe haber productos, mensajes, advertencias o errores.
De la misma manera que puede probar que no hay mensajes, errores y salida.
Otros consejos
En versiones recientes de TestThat, simplemente puede hacer:
expect_that(my.func(), not(gives_warning()))
Actualizar: Usar expect_silent()
hoy en día porque expect_that
está en desuso, consulte la ayuda para la función.
Actualización 2: Como lo menciona @eaglefreeman la respuesta usando expect_warning
con el parámetro regexp
ajustado a NA
es la mejor solución ya que mi respuesta hace que la prueba falle incluso si no se generó ninguna advertencia sino que solo se imprimió un mensaje.Esto no es lo que quería el OP (pero simplemente ignore las advertencias).No elimino esta respuesta para dejar clara esta diferencia a otros lectores.
De los ejemplos de la ayuda:
expect_silent("123")
f <- function() {
message("Hi!")
warning("Hey!!")
print("OY!!!")
}
expect_silent(f())
Advertencia: expect_silent
¡Tampoco espera ningún resultado, por lo que la semántica es un poco diferente!
Puedes comprobar si expect_warning()
falla.Lo siguiente resuelve tanto el problema de otro tipo de producción producida por my.func()
y not()
estando en desuso:
expect_failure(expect_warning(my.func()))