2013-01-23 5 views
6

मैं एक आर पैकेज के लिए कुछ परीक्षण लिख रहा हूं और R CMD check रखना चाहता हूं कि फ़ंक्शन कुछ इनपुट के लिए सही चेतावनियां प्रदर्शित करते हैं। लेकिन मैं यह नहीं समझ सकता कि चेतावनी आउटपुट कैप्चर कैसे करें ताकि मैं इसका परीक्षण कर सकूं।यह देखने के लिए कि क्या चेतावनी सही ढंग से फेंक दी गई है, में पैकेज परीक्षण कैसे लिखें?

तो अगर मैं एक समारोह की तरह: options बदलकर

warningOutput <-try(throwsWarning(1)) 
if (warningOutput!='Argument "x" is greater than zero, results may be incorrect'){ 
    stop('function "throwsWarning" did not produce correct warning when x>0') 
} 

अब तक मैंने पाया संभव आंशिक समाधान:

throwsWarning<-function(x){ 
    if(x>0){ 
    warning('Argument "x" is greater than zero, results may be incorrect') 
    } 
    # do something useful ... 
} 

मैं की तरह अपने परीक्षण फ़ाइल में एक कुछ चाहते हैं ताकि चेतावनियों को trycatch ब्लॉक के साथ त्रुटियों और आस-पास के रूप में माना जाता है। last.warning का परीक्षण मान भी माना जाता है, लेकिन अगर चेतावनी नहीं फेंक दी जाती है तो यह खतरनाक प्रतीत होता है (पिछले मूल्य का परीक्षण करेगा)। ऐसा लगता है कि ऐसा करने का एक आसान तरीका होना चाहिए कि मुझे याद आ रही है?

+1

आप अपने परीक्षणों में 'testthat' का उपयोग नहीं कर रहे हैं। – Spacedman

उत्तर

6

testthat package में expect_warning और gives_warning फ़ंक्शन है जिसका आप उपयोग कर सकते हैं।

उदाहरण से, आप कुछ इस तरह करना होगा:

R> library(testthat) 
R> expect_that(warning("this is a warning"), gives_warning("is a")) 
## This does not raise an error, but: 
R> expect_that(warning("this is a warning"), gives_warning("nope")) 
Error: warning("this is a warning") does not match 'nope'. Actual value: 
this is a warning 

तो, gives_warning गया रेगुलर एक्सप्रेशन चेतावनी है कि उत्सर्जित होना माना जाता है के खिलाफ मिलान किया जाता है है। यदि रेगेक्स मेल नहीं खाता (या कोई चेतावनी नहीं फेंकती है), तो एक लाल झंडा उठाया जाता है।

समान रूप से

, का उपयोग करते हुए कम expect_warning:

R> expect_warning(warning("this is a warning"), "is a") 
+1

लवली! मुझे विश्वास नहीं है कि मैं परीक्षण के बिना इस बार परीक्षण लिख रहा हूं। अगर सीआरएएन ने इसे पैकेज लेखन दस्तावेज़ों में सुझाव दिया तो अच्छा होगा। ऐसा लगता है कि केवल नकारात्मक पक्ष परीक्षण चलाने के लिए अतिरिक्त निर्भरता जोड़ रहा है। – skyebend

+0

आपको अपने रडार पर नहीं होने वाले पैकेज में ट्यून करने की खुशी हुई - खासकर जब प्रश्न में पैकेज पूरी तरह से भयानक है ;-) इसके अलावा, 'सुगेट्स' फ़ील्ड में 'testthat' डालें - इसकी आवश्यकता नहीं है 'निर्भर करता है 'या' आयात 'में होना चाहिए, इसलिए आप केवल उन लोगों के लिए पैकेज पर निर्भरता जोड़ रहे हैं जो वास्तव में परीक्षण चलाने के लिए चाहते हैं (न केवल वे लोग जो आपके पैकेज का उपयोग करना चाहते हैं)। –

2

आप अपने खुद के पैकेज लिख रहे हैं, यह मतलब हो सकता है फेंक (और पकड़ने) त्रुटि या चेतावनी के किसी विशिष्ट प्रकार से आर की हालत प्रणाली का उपयोग करने के । तो

myFun <- function(x) { 
    if (any(is.na(x))) { 
     w <- simpleWarning("'x' contains NA values") 
     class(w) <- c("HasNA", class(w)) 
     warning(w) 
    } 
    if (any(x < 0)) 
     warning("'x' contains values less than 0") 
    x 
} 

और फिर अपने परीक्षण, जैसे, library(RUnit) साथ में, tryCatch का उपयोग करें और बंद बस की स्थिति, यानी कि आप परीक्षण में रुचि रखते हैं, चेतावनी वर्ग HasNA साथ लेने:

test_myFun_NAwarning <- function() { 
    warnOccurred <- FALSE 
    tryCatch(myFun(1:5), HasNA = function(w) warnOcccurred <<- TRUE) 
    checkTrue(!warnOccurred) 
    tryCatch(myFun(-(1:5)), HasNA = function(w) warnOcccurred <<- TRUE) 
    checkTrue(!warnOccurred) 
    tryCatch(myFun(c(1:5, NA)), HasNA = function(w) warnOccurred <<- TRUE) 
    checkTrue(warnOccurred) 
} 

प्रमुख

> test_myFun_NAwarning() 
[1] TRUE 
Warning message: 
In myFun(-(1:5)) : 'x' contains values less than 0 

जो दिखाता है कि tryCatch केवल उस विशेष चेतावनी को पकड़ रहा है जिसमें आप रुचि रखते हैं, और वा में ऐसा करना वाई जो स्ट्रिंग के पाठ से मेल खाने पर भरोसा नहीं करता है। हो सकता है कि आपके पैकेज के लिए सभी चेतावनियां बनाने के लिए आपके पास एक सहायक कार्य .warn होगा। अतिरिक्त विवरण के लिए ?withCallingHandlers देखें; withCallingHandlers और muffleRestarttryCatch के रास्ते को रोकने के बजाए चेतावनी के बाद निरंतर मूल्यांकन का सामना कैसे किया जा सकता है।

संबंधित मुद्दे