2013-11-26 17 views
7

के लिए एक एप्लिकेशन प्रारंभ करें मैं आधिकारिक प्ले दस्तावेज़ से Specs2 का उपयोग कर स्कैला परीक्षण उदाहरणों का पालन कर रहा हूं। मुझे लगता है कि वे की तरह WithApplication का उपयोग के खिलाफ परीक्षण करने के लिए एक नकली आवेदन शुरू करने clode साथ, नोटिस निम्नलिखित:प्ले फ़ेमवर्क 2 - स्कैला - टेस्ट-सूट

"something" should { 
    "do X" in new WithApplication { /* ... */ } 
    "do Y" in new WithApplication { /* ... */ } 
    "do Z" in new WithApplication { /* ... */ } 
} 

यह ठीक है और सभी है, लेकिन समस्या यह है कि मैं आ रही है कि मैं की लागत उठाना है मेरा आवेदन हर बार शुरू होता है। एक बार आपके टेस्ट-सूट उचित आकार में बढ़ने के बाद यह आवश्यक नहीं है "कम से कम" या कम से कम तेज़ नहीं।

val app = FakeApplication() 
"something" should { 
    "do X" in new WithApplication(app) { /* ... */ } 
    "do Y" in new WithApplication(app) { /* ... */ } 
    "do Z" in new WithApplication(app) { /* ... */ } 
} 

और

"something" should { 
    val app = FakeApplication() 
    Helpers.running(app) { 
     "do X" in { /* ... */ } 
     "do Y" in { /* ... */ } 
     "do Z" in { /* ... */ } 
    } 
} 

पहले पहले टेस्ट के लिए काम करने लगता है और फिर बाद में परीक्षण पर डाटाबेस कनेक्शन समस्याओं के बारे में शिकायत: मैं की तरह काम करने की कोशिश की है। मुझे लगता है कि यहां कुछ बंद हो रहा है या कुछ (निश्चित नहीं है)।

दूसरा काम नहीं करता है क्योंकि यह शिकायत करता है कि कोई रनिंग एप्लिकेशन नहीं है, जिसे मैं या तो सुनिश्चित नहीं कर रहा हूं।

किसी भी मदद की बहुत सराहना की जाती है। धन्यवाद!

उत्तर

4

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

आपके द्वारा प्रदान किया गया पहला समाधान काम नहीं करता है क्योंकि एप्लिकेशन केवल एक बार उपयोग किए जा सकते हैं। यह WithApplication है जो आपके एप्लिकेशन को शुरू और बंद कर देता है, इसलिए यदि यह काम करता है, तो आपको कोई प्रदर्शन लाभ नहीं मिलेगा।

आपके द्वारा प्रदान किया गया दूसरा समाधान काम नहीं करता है क्योंकि जब Helpers.running(app) { } कोड ब्लॉक चलता है, तो यह केवल चश्मा घोषित करता है। चश्मा इन सभी को एक सूची में रखता है, और फिर आप चल रहे ब्लॉक से बाहर निकलते हैं और यह ऐप को बंद कर देता है। फिर कुछ बिंदु बाद, चश्मे परीक्षण चलाते हैं, और फिर पाठ्यक्रम का कोई आवेदन नहीं है।

तो, यदि आप अपने शेष ऐप के अलगाव में अपने कोड का परीक्षण नहीं कर सकते हैं, तो आपको एक चलने वाला ऐप होना चाहिए, इसके बारे में आप कुछ भी नहीं कर सकते हैं, यह एकीकरण परीक्षण की वास्तविकता है। और आप शायद इसे प्रत्येक परीक्षण के बीच शुरू करना और बंद करना चाहते हैं, अन्यथा आपके परीक्षण एक-दूसरे के अलगाव में नहीं चल रहे हैं।

3

यह पुराना है, लेकिन मैं अपना जवाब दूंगा। चूंकि मुझे एक ही समस्या का सामना करना पड़ा, और इसी तरह का विचार था।

package com.equipx.spec.util 

import org.specs2.specification.{AfterAll, BeforeAll} 
import play.Application 
import play.api.Play 
import play.test.{Helpers, FakeApplication} 

/** 
* @author Anton Oparin ([email protected]) 
*/ 
trait WithGlobalApplication extends BeforeAll with AfterAll { 

    protected var app: Application = null 

    /** 
    * Override this method to setup the application to use. 
    * 
    * By default this will call the old {@link #provideFakeApplication() provideFakeApplication} method. 
    * 
    * @return The application to use 
    */ 
    protected def provideApplication: Application = { 
    return provideFakeApplication 
    } 

    /** 
    * Old method - use the new {@link #provideApplication() provideApplication} method instead. 
    * 
    * Override this method to setup the fake application to use. 
    * 
    * @return The fake application to use 
    */ 
    protected def provideFakeApplication: FakeApplication = { 
    return Helpers.fakeApplication 
    } 

    override def beforeAll { 
    app = provideApplication 
    Helpers.start(app) 
    Play.current 
    } 

    override def afterAll { 
    if (app != null) { 
     Helpers.stop(app) 
     app = null 
    } 
    } 

} 

मूल रूप से मैं WithApplication कार्यान्वयन ले लिया, और यह वैश्विक बनाया: वहाँ afterall spec2 में & BeforeAll लक्षण तो मेरे समाधान मूल रूप से है शायद यह पोस्ट के समय में वहाँ नहीं था है,।

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