Question

J'écris des tests pour une fonction qui, dans certaines conditions, générera des avertissements.Je veux m'assurer que dans les autres conditions, il ne produit pas d'avertissements.Je ne vois pas de moyen évident de tester cela facilement avec testthat.Je suppose que je pourrais faire quelque chose comme :

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

Ou utiliser options(warn=2), mais j'espérais qu'il y aurait quelque chose comme :

expect_no_warnings(my.func())

Est-ce que j'ai raté quelque chose d'évident ?

Était-ce utile?

La solution

Dans des versions encore plus récentes de « testthat » (de 0.11.0) tu peux faire:

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

À partir de la documentation de expect_error

expression rationnelle :expression régulière à tester.En cas d'omission, affirme simplement que le code produit une sortie, un message, un avertissement ou une erreur.Vous pouvez également spécifier NA pour indiquer qu'il ne doit y avoir aucune sortie, message, avertissement ou erreur.

Ainsi, de la même manière, vous pouvez tester qu’il n’y a pas de messages, d’erreurs et de sorties.

Autres conseils

Dans les versions récentes de testthat, vous pouvez simplement faire :

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

Mise à jour: Utiliser expect_silent() de nos jours parce que expect_that est obsolète, consultez l'aide pour la fonction !.

Mise à jour 2 : Comme mentionné par @eaglefreeman la réponse en utilisant expect_warning avec le paramètre regexp mis à NA est la meilleure solution puisque ma réponse provoque l'échec du test même si aucun avertissement n'a été émis mais qu'un simple message a été imprimé.Ce n'est pas ce que voulait le PO (mais ignorez simplement les avertissements).Je ne supprime pas cette réponse pour que cette différence soit claire pour les autres lecteurs.

À partir des exemples de l'aide :

expect_silent("123")

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

expect_silent(f())

Avertissement: expect_silent n'attend également aucune sortie, donc la sémantique est un peu différente !

Vous pouvez vérifier si expect_warning() échoue.Ce qui suit résout à la fois le problème des autres types de production produits par my.func() et not() étant obsolète :

expect_failure(expect_warning(my.func()))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top