Specs2/Guice Play 2.4.0 功能测试中的问题
Specs2/Guice issue in Play 2.4.0 functional tests
我遇到了一个问题,依赖项在测试之间明显流失,这导致大部分测试失败。在每种情况下,调试都会显示在测试 class 中创建的第一个应用程序用于所有测试,这会导致失败。
我试过添加 isolated
和 sequential
但没有效果。
我是在做一些非常愚蠢还是非常愚蠢的事情?
例如,这里是SubjectNotPresentTest.scala
class SubjectNotPresentTest extends AbstractViewTest {
"show constrained content when subject is not present" in new WithApplication(testApp(handler())) {
val html = subjectNotPresentContent(FakeRequest())
private val content: String = Helpers.contentAsString(html)
content must contain("This is before the constraint.")
content must contain("This is protected by the constraint.")
content must contain("This is after the constraint.")
}
"hide constrained content when subject is present" in new WithApplication(testApp(handler(subject = Some(user())))) {
val user = new User("foo", Scala.asJava(List.empty), Scala.asJava(List.empty))
val html = subjectNotPresentContent(FakeRequest())
private val content: String = Helpers.contentAsString(html)
content must contain("This is before the constraint.")
content must not contain("This is protected by the constraint.")
content must contain("This is after the constraint.")
}
}
GuiceApplicationBuilder 用于 parent class 用于创建用于测试的应用程序。
val app = new GuiceApplicationBuilder()
.bindings(new DeadboltModule())
.bindings(bind[HandlerCache].toInstance(LightweightHandlerCache(handler)))
.overrides(bind[CacheApi].to[FakeCache])
.in(Mode.Test)
.build()
您可以在 https://travis-ci.org/schaloner/deadbolt-2-scala/builds/66369307#L805
查看失败示例
找到
谢谢,
史蒂夫
看起来问题是在有多个应用程序的测试环境中静态引用当前 Play 应用程序时引起的 - 即使它们在逻辑上是分开的。
因为无法将组件注入(据我所知)到模板中,所以我创建了一个 helper object,它使用 Play.current.injector
来定义几个 val
。
val viewSupport: ViewSupport = Play.current.injector.instanceOf[ViewSupport]
val handlers: HandlerCache = Play.current.injector.instanceOf[HandlerCache]
(TTBOMK,注入到对象中也是不可能的,否则我可以将组件注入到对象中,每个人都可以回家)。
更好的方法是将需要的内容公开为隐式。
object ViewAccessPoint {
private[deadbolt] val viewStuff = Application.instanceCache[ViewSupport]
private[deadbolt] val handlerStuff = Application.instanceCache[HandlerCache]
object Implicits {
implicit def viewSupport(implicit application: Application): ViewSupport = viewStuff(application)
implicit def handlerCache(implicit application: Application): HandlerCache = handlerStuff(application)
}
}
在视图中,导入隐式函数,一切顺利。
@import be.objectify.deadbolt.scala.DeadboltHandler
@import be.objectify.deadbolt.scala.ViewAccessPoint.Implicits._
@import play.api.Play.current
@(handler: DeadboltHandler = handlerCache(current).apply(), name: String, meta: String = null, timeout: Function0[Long] = viewSupport.defaultTimeout)(body: => play.twirl.api.Html)(implicit request: Request[Any])
@if(viewSupport.dynamic(name, meta, handler, timeout(), request)) {
@body
}
我遇到了一个问题,依赖项在测试之间明显流失,这导致大部分测试失败。在每种情况下,调试都会显示在测试 class 中创建的第一个应用程序用于所有测试,这会导致失败。
我试过添加 isolated
和 sequential
但没有效果。
我是在做一些非常愚蠢还是非常愚蠢的事情?
例如,这里是SubjectNotPresentTest.scala
class SubjectNotPresentTest extends AbstractViewTest {
"show constrained content when subject is not present" in new WithApplication(testApp(handler())) {
val html = subjectNotPresentContent(FakeRequest())
private val content: String = Helpers.contentAsString(html)
content must contain("This is before the constraint.")
content must contain("This is protected by the constraint.")
content must contain("This is after the constraint.")
}
"hide constrained content when subject is present" in new WithApplication(testApp(handler(subject = Some(user())))) {
val user = new User("foo", Scala.asJava(List.empty), Scala.asJava(List.empty))
val html = subjectNotPresentContent(FakeRequest())
private val content: String = Helpers.contentAsString(html)
content must contain("This is before the constraint.")
content must not contain("This is protected by the constraint.")
content must contain("This is after the constraint.")
}
}
GuiceApplicationBuilder 用于 parent class 用于创建用于测试的应用程序。
val app = new GuiceApplicationBuilder()
.bindings(new DeadboltModule())
.bindings(bind[HandlerCache].toInstance(LightweightHandlerCache(handler)))
.overrides(bind[CacheApi].to[FakeCache])
.in(Mode.Test)
.build()
您可以在 https://travis-ci.org/schaloner/deadbolt-2-scala/builds/66369307#L805
查看失败示例 找到谢谢, 史蒂夫
看起来问题是在有多个应用程序的测试环境中静态引用当前 Play 应用程序时引起的 - 即使它们在逻辑上是分开的。
因为无法将组件注入(据我所知)到模板中,所以我创建了一个 helper object,它使用 Play.current.injector
来定义几个 val
。
val viewSupport: ViewSupport = Play.current.injector.instanceOf[ViewSupport]
val handlers: HandlerCache = Play.current.injector.instanceOf[HandlerCache]
(TTBOMK,注入到对象中也是不可能的,否则我可以将组件注入到对象中,每个人都可以回家)。
更好的方法是将需要的内容公开为隐式。
object ViewAccessPoint {
private[deadbolt] val viewStuff = Application.instanceCache[ViewSupport]
private[deadbolt] val handlerStuff = Application.instanceCache[HandlerCache]
object Implicits {
implicit def viewSupport(implicit application: Application): ViewSupport = viewStuff(application)
implicit def handlerCache(implicit application: Application): HandlerCache = handlerStuff(application)
}
}
在视图中,导入隐式函数,一切顺利。
@import be.objectify.deadbolt.scala.DeadboltHandler
@import be.objectify.deadbolt.scala.ViewAccessPoint.Implicits._
@import play.api.Play.current
@(handler: DeadboltHandler = handlerCache(current).apply(), name: String, meta: String = null, timeout: Function0[Long] = viewSupport.defaultTimeout)(body: => play.twirl.api.Html)(implicit request: Request[Any])
@if(viewSupport.dynamic(name, meta, handler, timeout(), request)) {
@body
}