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?

¿Fue útil?

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()))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top