Как совместить WithApplication(Loader) и ExecutionEnv
Я пишу тесты Specs2 для методов, возвращающих фьючерсы в проекте с использованием фреймворка Scala и Play. Документация и ответы на этот вопрос рекомендуют использовать модификатор await, который требует добавления неявного ExecutionEnv. Минимальный рабочий пример (адаптированный из одного из упомянутых ответов):
class FutureSpec extends mutable.Specification {
"Even in future one" should {
"be greater than zero" in { implicit ee: ExecutionEnv =>
Future(1) must be_>(0).await
}
}
}
Но некоторые из моих тестов требуют WithApplicationLoader. Если я добавлю его в пример, он не скомпилируется:
class FutureSpec extends mutable.Specification {
"Even in future one" should {
"be greater than zero" in new WithApplicationLoader { implicit ee: ExecutionEnv =>
Future(1) must be_>(0).await
}
}
}
WithApplication вместо WithApplicationLoader имеет точно такой же эффект (как и ожидалось).
Можно ли использовать WithApplicationLoader вместе с неявным ExecutionEnv?
К сожалению, второй вариант, описанный в документации - перемещение ExecutionEnv в конструктор класса вместо определенного метода - недоступен. Эта спецификация:
class FutureSpec(implicit ee: ExecutionEnv) extends mutable.Specification {
"Even in future one" should {
"be greater than zero" in new WithApplicationLoader {
Future(1) must be_>(0).await
}
}
}
работает, но это игнорируется IntelliJ Idea (я могу запустить такую спецификацию отдельно, но конфигурация, выполняющая все тесты в проекте, не выполняет ее).
2 ответа
Это работает для меня с IntelliJ 2016.1.3:
import play.api.test.{PlaySpecification, WithApplication}
import org.specs2.concurrent.ExecutionEnv
import scala.concurrent.Future
class FutureSpec extends PlaySpecification {
implicit val ee = ExecutionEnv.fromGlobalExecutionContext
// // or this:
// implicit val ee = ExecutionEnv.fromExecutionContext(play.api.libs.concurrent.Execution.Implicits.defaultContext)
"Even in future one" should {
"be greater than zero" in new WithApplication {
Future(1) must be_>(0).await
}
}
}
Вот мой build.sbt
:
name := "throwaway"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies += "org.specs2" %% "specs2-core" % "3.8.5.1" % "test"
libraryDependencies += "com.typesafe.play" %% "play" % "2.5.9" % "test"
libraryDependencies += "com.typesafe.play" %% "play-specs2" % "2.5.9" % "test"
libraryDependencies += "com.typesafe.play" %% "play-test" % "2.5.9" % "test"
Вы всегда можете сделать это
class TestSpec extends mutable.Specification {
"test1" >> { implicit ee: ExecutionEnv =>
new WithApplicationLoader {
ok
}
}
}