2012-06-07 3 views
7

मैं स्कैला में specs2 के साथ कुछ डीबी निर्भर सामग्री का परीक्षण करने की कोशिश कर रहा हूं। लक्ष्य "डीबी रनिंग" के लिए परीक्षण करना है और फिर परीक्षण निष्पादित करना है। मुझे पता चला कि डीबी डाउन होने पर मैं मचर क्लास से या स्कीप का उपयोग कर सकता हूं।मैकर्स के बिना specs2 में एक टेस्ट कैसे छोड़ सकता हूं?

समस्या यह है कि मुझे एक मिलान की स्थिति (PASSED के रूप में) के लिए आउटपुट मिल रहा है और उदाहरण SKIPPED के रूप में चिह्नित किया गया है। मैं इसके बजाय क्या चाहता हूं: केवल एक परीक्षण निष्पादित करें जिसे परीक्षण डीबी ऑफ़लाइन होने पर "SKIPPED" के रूप में चिह्नित किया गया है।

package net.mycode 

import org.specs2.mutable._ 
import net.mycode.testkit.{TestKit} 
import org.junit.runner.RunWith 
import org.specs2.runner.JUnitRunner 

@RunWith(classOf[JUnitRunner]) 
class MyClassSpec extends SpecificationWithJUnit with TestKit with Logging { 

    "MyClass" should { 
    "do something" in { 
     val sut = new MyClass() 
     sut.doIt must_== "OK" 
    } 

    "do something with db" in { 
    checkDbIsRunning 

    // Check only if db is running, SKIP id not 
    } 
} 

बाहर अब:

Test MyClass should::do something(net.mycode.MyClassSpec) PASSED 
Test MyClass should::do something with db(net.mycode.MyClassSpec) SKIPPED 
Test MyClass should::do something with db(net.mycode.MyClassSpec) PASSED 

और उत्पादन मैं इसे होना चाहता हूँ और यहाँ मेरे "TestKit"

package net.mycode.testkit 

import org.specs2.mutable._ 
import net.mycode.{DB} 


trait MyTestKit { 

    this: SpecificationWithJUnit => 

    def debug = false 

    // Before example 
    step { 
    // Do something before 
    } 

    // Skip the example if DB is offline 
    def checkDbIsRunning = DB.isRunning() must be_==(true).orSkip 

    // After example 
    step { 
    // Do something after spec 
    } 
} 

के लिए कोड और यहाँ मेरी कल्पना के लिए कोड है:

Test MyClass should::do something(net.mycode.MyClassSpec) PASSED 
Test MyClass should::do something with db(net.mycode.MyClassSpec) SKIPPED 
+1

क्या आप कृपया वर्तमान कंसोल आउटपुट का उदाहरण दे सकते हैं और वांछित क्या होगा? – Eric

+0

आउटपुट नमूने जोड़ा गया – Alebon

उत्तर

6

मुझे लगता है कि आप क्या करना चाहते हैं के लिए एक सरल सशर्त उपयोग कर सकते हैं:

class MyClassSpec extends SpecificationWithJUnit with TestKit with Logging { 

    "MyClass" should { 
    "do something" in { 
     val sut = new MyClass() 
     sut.doIt must_== "OK" 
    } 
    if (DB.isRunning) { 
     // add examples here 
     "do something with db" in { ok } 
    } else skipped("db is not running") 
    } 
} 
+0

यह बिल्कुल सही नहीं है लेकिन बहुत उपयोगी है;) – Alebon

+0

@Eric यह अपवाद फेंकता है- test.functionality.Login: org.specs2.execute.SkipException चलाते समय अपरिचित अपवाद। क्या कोई ऐसा तरीका है जहां यह अपवाद नहीं फेंक देगा? – 0fnt

+1

मुझे लगता है कि "डीबी नहीं चल रहा है" छोड़कर 'काम करना चाहिए'। – Eric

5

क्या आपनेका उपयोग करने का प्रयास किया हैतर्क? few examples here देखें।

दुर्भाग्य से (जहां तक ​​मुझे पता है), आप इकाई विनिर्देश में एक उदाहरण को छोड़ नहीं सकते हैं। हालांकि, आप इस तरह इस तर्क के साथ विनिर्देश संरचना को छोड़ सकते हैं, तो आप अलग विनिर्देशों बनाने के लिए हो सकता है:

class MyClassSpec extends SpecificationWithJUnit { 

    args(skipAll = false) 

    "MyClass" should { 
    "do something" in { 
     success 
    } 

    "do something with db" in { 
     success 
    } 
    } 
} 
+0

बीटीडब्ल्यू आपको @RunWith की आवश्यकता नहीं है जब WithJUnit – OlegYch

+0

से विरासत में यह सही है, ठीक है। बीटीडब्ल्यू मैं जीएसओसी 2012 के दौरान स्पेक्स 2 के स्कैला आईडीई एकीकरण पर काम कर रहा हूं] (http://xcafebabe.blogspot.hu/2012/06/first-thoughts-on-scala.html), उम्मीद है कि हम सक्षम होंगे गर्मी के अंत में किसी भी टिप्पणी के बिना इसे चलाएं :-) – rlegendi

+3

एक समर्पित शॉर्टकट है, ['skipAllIf'] (http://etorreborre.github.com/specs2/guide/org.specs2.guide.Structure.html # छोड़ें + उदाहरण) यदि कोई शर्त संतुष्ट हो तो सभी उदाहरणों को छोड़ दें। यह विधि कम है और यदि आपकी बूलियन अभिव्यक्ति किसी को फेंकने के लिए होती है तो अपवादों को पकड़ लेगा। – Eric

2

इस has been added to specs 2.3.10 को संबोधित करने वाली एक नई सुविधा।

+0

साझा करने के लिए बहुत बढ़िया, thhx का हिस्सा है – Alebon

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