2015-06-12 60 views
2

我遇到了依赖关系问题,显然在测试之间出血,导致大多数测试失败。在每种情况下,调试都会显示在测试类中创建的第一个应用程序用于所有测试,这会导致失败。Play中的Specs2/Guice问题2.4.0功能测试

我试过添加isolatedsequential,这没有效果。

我在做一些非常愚蠢或微妙愚蠢的事情吗?

例如,这里的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

看到失败的例子所有的测试可以在https://github.com/schaloner/deadbolt-2-scala/tree/master/code/test/be/objectify/deadbolt/scala/views找到

感谢, 史蒂夫

回答

1

它看起来像问题时引起的电流Play应用程序在有多个应用程序的测试环境中静态引用 - 即使它们在逻辑上是分开的。

由于组件不能被注入(据我所知)到模板中,我创建了一个helper object,它使用Play.current.injector来定义一对val s。

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) 
    } 
} 

在视图中,导入implicits,你很好去。

@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 
}