2012-09-03 18 views
9

मेरे पास एक specs2 परीक्षण है जो FakeAplplication और एम्बेडेड mongodb डेटाबेस का उपयोग करता है।प्ले 2.0 कॉन्फ़िगरेशन के साथ FakeAplication सेटअप

def inMemoryMongoDatabase(name: String = "default"): Map[String, String] = { 
    val dbname: String = "play-test-" + scala.util.Random.nextInt 
    Map(
     ("mongodb." + name + ".db" -> dbname), 
     ("mongodb." + name + ".port" -> EmbeddedMongoTestPort.toString)) 
} 

override def around[T <% Result](t: => T) = { 
    running(FakeApplication(additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) { 
     t // execute t inside a http session 
    } 
} 

FakeApplication conf निर्देशिका और परीक्षण डेटाबेस प्रत्येक परीक्षा के लिए बनाए जाते हैं के लिए अतिरिक्त विन्यास में डिफ़ॉल्ट application.conf विन्यास का उपयोग करता।
यह तब तक काम कर रहा था जब तक हम एक mongodb प्रतिकृति सेट सेट नहीं करते। अब application.conf इस RepliCat के लिए विन्यास

mongodb.default.replicaset { 
host1.host = "localhost" 
host1.port = 27017 
host2.host = "localhost" 
host2.port = 27018 
host3.host = "localhost" 
host3.port = 27019 
} 

सेट FakeApplication डिफ़ॉल्ट कॉन्फ़िगरेशन परीक्षण असफल क्योंकि replicaset की मेजबान नहीं पाया जा सकता है का उपयोग करता है के रूप में शामिल हैं। मैं अपने परीक्षणों के लिए एक अलग विन्यास रखना चाहता हूं, मूल रूप से mongodb.default.replicaset प्रविष्टि को हटा दें। यदि mongodb.default.replicaset एक साधारण मानचित्र [स्ट्रिंग, स्ट्रिंग] था जो आसान होगा क्योंकि मैं इसे केवल additonal कॉन्फ़िगरेशन में जोड़ सकता हूं लेकिन जब मैं ऐसा करने का प्रयास करता हूं तो यह विफल हो जाता है क्योंकि अपेक्षित मान प्रकार स्ट्रिंग नहीं बल्कि ऑब्जेक्ट होता है। मैंने पथ पैरामीटर के माध्यम से FakeApplication को एक अलग test.conf फ़ाइल प्रदान करने का भी प्रयास किया है।

override def around[T <% Result](t: => T) = { 
    running(FakeApplication(path = new java.io.File("conf/test.conf"), additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) { 
     t // execute t inside a http session 
    } 
} 

यह काम नहीं करता क्योंकि यह किसी भी कॉन्फ़िगरेशन को लोड नहीं करता था।

मैं किसी भी मदद की सराहना करता हूं। धन्यवाद।

क्रिस

उत्तर

3

समस्या यह है कि Play's FakeAppication का उपयोग करके एकीकरण परीक्षण चलाते समय test.conf फ़ाइल को निर्दिष्ट करने का तरीका है। मेरे एकीकरण परीक्षण में मैं play -Dconfig.file=conf/test.conf पर कॉल नहीं कर सकता।

इस मैं क्या करने में कामयाब रहे है:

object FakeSalatApp extends Around { 

def EmbeddedMongoTestPort: Int = 27028 

def inMemoryMongoDatabase(name: String = "default"): Map[String, String] = { 
    val dbname: String = "play-test-" + scala.util.Random.nextInt 
    Map(
    ("mongodb." + name + ".db" -> dbname), 
    ("mongodb." + name + ".port" -> EmbeddedMongoTestPort.toString), 
    ("mongodb." + name + ".replicaset.host1.host" -> "localhost"), 
    ("mongodb." + name + ".replicaset.host1.port" -> EmbeddedMongoTestPort.toString), 
    ("mongodb." + name + ".replicaset.host2.host" -> "localhost"), 
    ("mongodb." + name + ".replicaset.host2.port" -> (EmbeddedMongoTestPort + 1).toString), 
    ("mongodb." + name + ".replicaset.host3.host" -> "localhost"), 
    ("mongodb." + name + ".replicaset.host3.port" -> (EmbeddedMongoTestPort + 2).toString)) 
    } 

override def around[T <% Result](t: => T) = { 
    running(FakeApplication(additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) { 
    t // execute t inside a http session 
    } 
} 
} 
0

का उपयोग path यहाँ काम नहीं करेगा, क्योंकि यह FakeApplication आप चला रहे हैं का मार्ग है (आप कुछ मामलों में एक अलग रास्ता हो सकता है)।

आपके मामले में जो सुझाव है, वह test.conf निर्दिष्ट करने के लिए परीक्षण मोड के लिए चलाएं, जैसे उदा।

play -Dconfig.file=conf/test.conf 

फिर test.conf उठाया जाएगा। इसके बाद आप इसे अपने सामान्य application.conf भी शामिल कर सकते हैं और केवल मोंगो सेटिंग्स को ओवरराइड कर सकते हैं।

शायद यह भी होगा कि "सिंगल लक्ष्य मोड" आपके application.conf में मोंगोडब से कनेक्ट करने का डिफ़ॉल्ट तरीका है, और केवल उत्पादन कॉन्फ़िगरेशन में प्रतिकृतिसेट का उपयोग करने के लिए mongob कॉन्फ़िगरेशन को ओवरराइट करें।

10

हम एक ऐसी ही समस्या हमारे एकीकरण परीक्षण के लिए अतिरिक्त विन्यास लोड हो रहा था।

private Configuration additionalConfigurations; 
@Before 
public void initialize(){ 
    Config additionalConfig = ConfigFactory.parseFile(new File("conf/integration.conf")); 
    additionalConfigurations = new Configuration(additionalConfig); 
} 
@Test 
public void testPropertiesGetLoaded() throws Exception{ 
    running(testServer(3333, fakeApplication(additionalConfigurations.asMap())), HTMLUNIT, new Callback<TestBrowser>(){ 
     public void invoke(TestBrowser browser){ 
      String specificProperty = Play.application().configuration().getString("specific.property"); 
      System.out.println(specificProperty); 
     } 
    }); 
} 

अगर वहाँ चीजों की स्काला की ओर एक अच्छा विधि, हम जावा में हमारे सभी कोड कर रहे हैं मैं नहीं जानता: हम नक्शे को आबाद करने पाया मैन्युअल कठिन होने के लिए तो हम निम्नलिखित दृष्टिकोण का इस्तेमाल किया।

2

इस तरह मैंने इसे Play 2.3 में किया था।एक्स

  1. (नहीं जड़ पैकेज) एक पैकेज में एक वर्ग AppGlobal में अपने आवेदन GlobalSettings परिभाषित

    package configs 
    
    class AppGlobal extends GlobalSettings { 
        // Your application global settings 
        ??? 
    } 
    
  2. object Global extends AppGlobal जो आपके आवेदन के रूप में प्रयोग किया जाता है परिभाषित आवेदन वैश्विक सेटिंग्स।

  3. परीक्षण कक्षा में, एक परीक्षण वैश्विक परिभाषित करें। परीक्षण विन्यास अंत में जोड़ा जाता है ओवरराइड या समग्र आवेदन विन्यास में जोड़ने के लिए:

    object TestGlobal extends AppGlobal { 
        override def onLoadConfig(config: Configuration, 
              path: File, 
              classloader: ClassLoader, 
              mode: Mode): Configuration = { 
        config ++ configuration ++ 
          Configuration.load(path, mode = Mode.Dev, 
              Map("config.file" -> "conf/test.conf")) 
        } 
    } 
    
  4. ऊपर TestGlobal

    FakeApplication(withGlobal = Some(TestGlobal)) 
    
1

मेरे मामले में मैं बस के साथ नकली आवेदन बनाएं एक बेस क्लास बनाया है जो मेरे सभी परीक्षणों का विस्तार करता है। नकली अनुप्रयोग बनाने से ठीक पहले मैं सिस्टम प्रॉपर्टी config.resource परिभाषित करता हूं जो एप्लिकेशन की कॉन्फ़िगरेशन सेट करता है। तब मैं इस प्रकार मेरी विन्यास संरचित है:

application.conf: विशिष्ट विन्यास

test.conf शामिल नहीं env: application.conf भी शामिल है और इकाई परीक्षण

env_local चलाने के लिए विन्यास परिभाषित करता है। conf: application.conf भी शामिल है और एप्लिकेशन को चलाने के लिए स्थानीय रूप से

env_prod.conf विन्यास परिभाषित करता है: env_local.conf की तरह लेकिन उत्पादन आदि के लिए ...

मेरी परियोजना में, सुविधा के लिए मैं एक स्क्रिप्ट local.sh कि बस उत्प्रेरक -Dconfig.resource = env_local.conf

@RunWith(classOf[JUnitRunner]) 
class ApplicationTest extends FunSuite with MockitoSugar { 
    System.setProperty("config.resource", "test.conf") 
    val app = Helpers.fakeApplication() 
} 
चलाता crated है
संबंधित मुद्दे