Frage

Ich schreibe Tests für eine Funktion, die unter bestimmten Bedingungen Warnungen generiert.Ich möchte sicherstellen, dass unter den anderen Bedingungen keine Warnungen ausgegeben werden.Ich sehe keine offensichtliche Möglichkeit, das einfach zu testen testthat.Ich denke, ich könnte so etwas tun:

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

oder nutzen options(warn=2), aber ich hatte gehofft, dass es so etwas geben würde:

expect_no_warnings(my.func())

Übersehe ich etwas Offensichtliches?

War es hilfreich?

Lösung

In noch neueren Versionen von „testthat“ (von 0.11.0) du kannst tun:

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

Aus der Dokumentation von expect_error

regulärer Ausdruck:Regulärer Ausdruck zum Testen.Wenn es weggelassen wird, wird lediglich bestätigt, dass der Code eine Ausgabe, Meldung, Warnung oder einen Fehler erzeugt.Alternativ können Sie NA angeben, um anzugeben, dass keine Ausgaben, Meldungen, Warnungen oder Fehler erfolgen sollen.

So können Sie auf die gleiche Weise testen, dass keine Meldungen, Fehler und Ausgaben vorliegen.

Andere Tipps

In neueren Versionen von testthat können Sie einfach Folgendes tun:

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

Aktualisieren: Verwenden expect_silent() heutzutage, weil expect_that ist veraltet, siehe Hilfe für die Funktion!.

Update 2: Wie von @eaglefreeman erwähnt die Antwort mit expect_warning mit dem param regexp einstellen NA ist die beste Lösung, da meine Antwort dazu führt, dass der Test fehlschlägt, selbst wenn keine Warnung ausgegeben wurde, sondern nur eine Nachricht gedruckt wurde.Das ist nicht das, was das OP wollte (aber Warnungen einfach ignorieren).Ich lösche diese Antwort nicht, um diesen Unterschied für andere Leser deutlich zu machen.

Aus den Beispielen der Hilfe:

expect_silent("123")

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

expect_silent(f())

Warnung: expect_silent erwartet auch keine Ausgabe, daher ist die Semantik etwas anders!

Sie können überprüfen, ob expect_warning() scheitert.Im Folgenden wird das Problem gelöst, dass andere Arten von Ausgaben erzeugt werden my.func() Und not() veraltet:

expect_failure(expect_warning(my.func()))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top