Как совместить 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
    }
  }
}
Другие вопросы по тегам