2016-06-16 10 views
4

I haben folgende Funktion:R TryCatch mit testthat Erwartung

fun = function(expr) { 
    mc = match.call() 

    env = as.environment(within(
    list(), 
    expr = eval(mc$expr) 
)) 

    return(env) 
} 

, die so innerhalb eines tryCatch() aufgerufen wird, dass alle Fehlerbedingungen in expr ordnungsgemäß gehandhabt werden.

Es arbeitet mit einem Standard-Fehlerzustand fein:

tryCatch({ 
    fun({ 
    stop('error') 
    }) 
}, error = function(e) { 
    message('error happened') 
}) 

# error happened 

Allerdings ist es nicht testthat Erwartungsfehler erfassen (was für meinen speziellen Anwendungsfall bevorzugt wird):

library(testthat) 

tryCatch({ 
    fun({ 
    expect_true(FALSE) 
    }) 
}, error = function(e) { 
    message('expectation not met') 
}) 

# Error: FALSE isn't true. 

oder einfacher :

library(testthat) 

tryCatch({ 
    expect_true(FALSE) 
}, error = function(e) { 
    message('expectation not met') 
}) 

# Error: FALSE isn't true. 

Der Erwartungsfehler wird nicht abgefangen.

Dieses Problem trat nach dem Upgrade von R 3.2.2 auf R 3.3.0 auf - d. H. Erwartungsfehler wurden gerade in R 3.2.2 behoben.

Gibt es eine Möglichkeit, testthat Erwartungen von tryCatch() in R 3.3.0 gefangen zu machen?

+0

Die 'expect_xxx' Funktionen aufrufen' expect' die wiederum ruft 'withRestarts'. Ich weiß nicht genau, was das ist, aber es scheint die Wurzel des Problems zu sein, das du hast. – Dason

+0

@Dason Ja, das habe ich bemerkt. Ich bin mir nicht sicher, ob das immer der Fall war (z. B. zurück als ich meinen Code mit R 3.2.2 entwickelt habe). Idealerweise würde ich es vorziehen, sein aktuelles Verhalten ohne Affenflicken zu umgehen. – oddHypothesis

Antwort

7

stellte ich die Debugger auf expect() dann durch ein Paar von Codezeilen gestuftes (Ausgang der Kürze halber bearbeitet) und bei der Klasse der Bedingung sah es ist kein Zustand von

> debug(expect) 
> xx = expect_true(FALSE) 
... 
Browse[2]> n 
debug: exp <- as.expectation(exp, ..., srcref = srcref) 
Browse[2]> 
... 
Browse[2]> class(exp) 
[1] "expectation_failure" "expectation"   "condition" 
Browse[2]> Q 
> undebug(expect)  

so signalisiert wird Klasse ‚Fehler‘, und fing ausdrücklich

> tryCatch(expect_true(FALSE), expectation_failure=conditionMessage) 
[1] "FALSE isn't true.\n" 

Sie könnten auch die expectation Klasse fangen werden können.

Der Neustart ermöglicht es Ihnen, fortzufahren, wenn das irgendwie wichtig wäre.

result <- withCallingHandlers({ 
    expect_true(FALSE) 
    expect_true(!TRUE) 
    expect_true("this sentence") 
}, expectation_failure=function(e) { 
    cat(conditionMessage(e)) 
    invokeRestart("continue_test") 
}) 

mit Ausgang

FALSE isn't true. 
!TRUE isn't true. 
"this sentence" isn't true. 
> result 
[1] FALSE 

Man könnte auch Erfolge fangen oder zu handhaben

> tryCatch(expect_true(TRUE), expectation_success=class) 
[1] "expectation_success" "expectation"   "condition" 
+0

Danke! Es war mir aus der 'tryCatch()' -Dokumentation sicher nicht klar, dass Sie Handler für bestimmte Klassen angeben können. Ein weiterer zu meiner Liste von R Tricks hinzufügen. – oddHypothesis

Verwandte Themen