Domanda

Sto scrivendo test per una funzione che in alcune condizioni genererà avvertimenti.Voglio assicurarmi che nelle altre condizioni non producano avvisi.Non vedo un modo ovvio per testare facilmente questo con testthat.Immagino di poter fare qualcosa come:

my.result <- 25
my.func <- function() my.result
expect_equal(
  withCallingHandlers(
    my.func(), warning=function() stop("A Warning!")
  ), 
  my.result
)
.

o Usa options(warn=2), ma speravo che ci piacciano qualcosa come:

expect_no_warnings(my.func())
.

Mi manca qualcosa di ovvio?

È stato utile?

Soluzione

In versioni ancora più recenti di'Testthat'at (da 0.11.0 ) puoiFai:

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

Dalla documentazione di expect_error

.

regexp: espressione regolare da testare.Se omesso, afferma semplicemente che il codice produce un po 'di output, Messsage, Avvertenza o errore.In alternativa, è possibile specificare NA per indicare che non ci dovrebbero essere output, messaggi, avvertenze o errori.

Quindi nello stesso modo in cui è possibile testare che non ci sono messaggi, errori e output.

Altri suggerimenti

Nelle versioni recenti di TestThat, puoi semplicemente fare:

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

Aggiornamento: Usa expect_silent() Oggi perché expect_that è deprecato, vedere Aiuto per la funzione!.

Aggiornamento 2: Come menzionato da @eaglefreeman La risposta utilizzando expect_warning con il param regexp set su NA è la soluzione migliore poiché la mia risposta fa sì che il test fallisca nemmeno se nessun avviso è stato sollevato, ma è stato stampato solo un messaggio AA.Questo non è ciò che l'OP voleva (ma semplicemente ignora gli avvertimenti).Non elimino questa risposta per rendere chiara questa differenza per altri lettori.

Dai esempi dell'aiuto:

expect_silent("123")

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

expect_silent(f())
.

Avvertenza: expect_silent non prevede inoltre alcuna output in modo che la semantica sia un po 'diversa!

È possibile controllare se expect_warning() non riesce.Il seguente risolve sia la questione di altro tipo di produzione prodotta da my.func() e not() che viene deprecato:

expect_failure(expect_warning(my.func()))
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top