2016-03-03 61 views
1

我正在使用play 2.3.8,并在我的GlobalSettings中有一些基于应用程序模式进行更改的配置。所以,我有这样的事情:播放2.3 FakeApplication模式未在测试中设置?

object Global extends GlobalSettings { 
    override def onLoadConfig(config: Configuration, path: java.io.File, classloader: ClassLoader, mode: Mode.Mode) = { 
     println(mode) 
     val customConfig = //Based on mode.* 
     config ++ configuration ++ Configuration(ConfigFactory.parseMap(customConfig)) 
    } 
} 

然后想写测试,以确保这种行为的工作原理:

class MyTest extends PlaySpec { 

    val testApp = FakeApplication(
     additionalConfiguration = Map(
      //SomeSettings And Stuff 
      "logger.application" -> "WARN", 
      "logger.root" -> "WARN" 
     ) 
    ) 

    val devApp = new FakeApplication(
     additionalConfiguration = Map(
      //SomeSettings And Stuff 
      "logger.application" -> "WARN", 
      "logger.root" -> "WARN" 
     ) 
    ) { 
     override val mode = Mode.Dev 
    } 

    val prodApp = new FakeApplication(
     additionalConfiguration = Map(
      //SomeSettings And Stuff 
      "logger.application" -> "WARN", 
      "logger.root" -> "WARN" 
     ) 
    ) { 
     override val mode = Mode.Prod 
    } 

    "ThisNonWorkingTestOfMine" must { 

     "when running application in test mode have config.thing = false" in running(testApp) { 
      assertResult(Mode.Test)(testApp.mode) 
      assertResult(false)(testApp.configuration.getBoolean("config.thing").get) 
     } 

     "when running application in dev mode have config.thing = false" in running(devApp) { 
      assertResult(Mode.Dev)(devApp.mode) 
      assertResult(false)(devApp.configuration.getBoolean("config.thing").get) 
     } 

     "when running application in prod mode have config.thing = true" in running(prodApp) { 
      assertResult(Mode.Prod)(prodApp.mode) 
      assertResult(true)(prodApp.configuration.getBoolean("config.thing").get) 
     } 
    } 

} 

当我运行这些测试中,我看到的东西有点古怪从我得心应手println

Test 
null 
null 
[info] MyTest: 
[info] ThisNonWorkingTestOfMine 
[info] play - Starting application default Akka system. 
[info] play - Shutdown application default Akka system. 
[info] - must when running application in test mode have config.thing = false 
[info] play - Application started (Dev) 
[info] - must when running application in dev mode have config.thing = false 
[info] play - Application started (Prod) 
[info] - must when running application in prod mode have config.thing = true *** FAILED *** 
[info] Expected true, but got false (MyTest.scala:64) 
[info] ScalaTest 

如何正确设置FakeApplication的模式播放2.3?我现在是基于从Mastering Play在页面上,但显然的方法是不使用的时候onLoadConfig似乎

编辑要走的路: 我也尝试OneAppPerTest和创建在该FakeApplicationnewAppForTest方法,但它仍然表现怪异,null与上述方法类似。因为让我FakeApplication,然后尝试在我Global对象从config.getString读它,如果我在additionalConfiguration地图设置像"foo" -> "bar"随机属性时,这是很奇怪的,它得到的记录为None,即使当我在测试它本身做app.configuration.getString显示bar。感觉这里有一些类型的断开。而我,如果我用FakeApplication.apply方法,而不是new FakeApplication

回答

0

没有得到空的模式,所以我觉得这事做the way that FakeApplication sets the mode to Mode.Test via override,因为如果我复制FakeApplication类,并删除该行并创建自己的版本让我设置模式的课程我没有问题。换句话说,在我的测试包,我宣布了以下类:

package play.api.test 

import play.api.mvc._ 
import play.api.libs.json.JsValue 
import scala.concurrent.Future 
import xml.NodeSeq 
import play.core.Router 
import scala.runtime.AbstractPartialFunction 
import play.api.libs.Files.TemporaryFile 
import play.api.{ Application, WithDefaultConfiguration, WithDefaultGlobal, WithDefaultPlugins } 

case class FakeModeApplication(
    override val path: java.io.File = new java.io.File("."), 
    override val classloader: ClassLoader = classOf[FakeModeApplication].getClassLoader, 
    val additionalPlugins: Seq[String] = Nil, 
    val withoutPlugins: Seq[String] = Nil, 
    val additionalConfiguration: Map[String, _ <: Any] = Map.empty, 
    val withGlobal: Option[play.api.GlobalSettings] = None, 
    val withRoutes: PartialFunction[(String, String), Handler] = PartialFunction.empty, 
    val mode: play.api.Mode.Value 
) extends { 
    override val sources = None 
} with Application with WithDefaultConfiguration with WithDefaultGlobal with WithDefaultPlugins { 
    override def pluginClasses = { 
     additionalPlugins ++ super.pluginClasses.diff(withoutPlugins) 
    } 

    override def configuration = { 
     super.configuration ++ play.api.Configuration.from(additionalConfiguration) 
    } 

    override lazy val global = withGlobal.getOrElse(super.global) 

    override lazy val routes: Option[Router.Routes] = { 
     val parentRoutes = loadRoutes 
     Some(new Router.Routes() { 
      def documentation = parentRoutes.map(_.documentation).getOrElse(Nil) 
      // Use withRoutes first, then delegate to the parentRoutes if no route is defined 
      val routes = new AbstractPartialFunction[RequestHeader, Handler] { 
       override def applyOrElse[A <: RequestHeader, B >: Handler](rh: A, default: A => B) = 
        withRoutes.applyOrElse((rh.method, rh.path), (_: (String, String)) => default(rh)) 
       def isDefinedAt(rh: RequestHeader) = withRoutes.isDefinedAt((rh.method, rh.path)) 
      } orElse new AbstractPartialFunction[RequestHeader, Handler] { 
       override def applyOrElse[A <: RequestHeader, B >: Handler](rh: A, default: A => B) = 
        parentRoutes.map(_.routes.applyOrElse(rh, default)).getOrElse(default(rh)) 
       def isDefinedAt(x: RequestHeader) = parentRoutes.map(_.routes.isDefinedAt(x)).getOrElse(false) 
      } 
      def setPrefix(prefix: String) { 
       parentRoutes.foreach(_.setPrefix(prefix)) 
      } 
      def prefix = parentRoutes.map(_.prefix).getOrElse("") 
     }) 
    } 
} 

然后在我的测试,我可以使用它像这样:

val devApp = new FakeModeApplication(
    additionalConfiguration = Map(
     //SomeSettings And Stuff 
     "logger.application" -> "WARN", 
     "logger.root" -> "WARN" 
    ), mode = Mode.Dev 
) 

然后将模式值来通过正如我将其设置为而不是null

我张贴这是一个答案,因为它确实解决我所面临的问题,但我没有的为什么使得像这样一个FakeApplication当新关键字的理解:new FakeApplication() { override mode ... }导致模式在GlobalSettings上的onLoadConfig方法中为null。这感觉就像一个黑客而不是一个解决方案,如果有足够的知识的人可以发布一个解决方案,包括不复制整个FakeApplication类并更改一行,那么我会很感激。

相关问题