Тест Specs2 в играх дает мне «не удалось найти неявное значение для параметра доказательства типа org.specs2.main.CommandLineAsResult

Я пытаюсь написать тестовый пример для простого REST API в Play2 / Scala, который отправляет / получает JSON. Мой тест выглядит следующим образом:

import org.junit.runner.RunWith
import org.specs2.matcher.JsonMatchers
import org.specs2.mutable._
import org.specs2.runner.JUnitRunner
import play.api.libs.json.{Json, JsArray, JsValue}
import play.api.test.Helpers._
import play.api.test._
import play.test.WithApplication

/**
  * Add your spec here.
  * You can mock out a whole application including requests, plugins etc.
  * For more information, consult the wiki.
  */

@RunWith(classOf[JUnitRunner])
class APIv1Spec extends Specification with JsonMatchers {

  val registrationJson = Json.parse("""{"device":"576b9cdc-d3c3-4a3d-9689-8cd2a3e84442", |
                             "firstName":"", "lastName":"Johnny", "email":"[email protected]", |
                             "pass":"myPassword", "acceptTermsOfService":true}
                                """)

  def dropJsonElement(json : JsValue, element : String) = (json \ element).get match {
    case JsArray(items) => util.dropAt(items, 1)
  }

  def invalidRegistrationData(remove : String) = {
    dropJsonElement(registrationJson,remove)
  }

  "API" should {

    "Return Error on missing first name" in new WithApplication {

      val result= route(
        FakeRequest(
          POST,
          "/api/v1/security/register",
          FakeHeaders(Seq( ("Content-Type", "application/json") )),
          invalidRegistrationData("firstName").toString()
        )
      ).get

      status(result) must equalTo(BAD_REQUEST)
      contentType(result) must beSome("application/json")
    }
    ...

Однако когда я пытаюсь запустить sbt test, я получаю следующую ошибку:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=384M; support was removed in 8.0
[info] Loading project definition from /home/cassius/brentspace/esalestracker/project
[info] Set current project to eSalesTracker (in build file:/home/cassius/brentspace/esalestracker/)
[info] Compiling 3 Scala sources to /home/cassius/brentspace/esalestracker/target/scala-2.11/test-classes...
[error] /home/cassius/brentspace/esalestracker/test/APIv1Spec.scala:34: could not find implicit value for evidence parameter of type org.specs2.main.CommandLineAsResult[play.test.WithApplication{val result: scala.concurrent.Future[play.api.mvc.Result]}]
[error]     "Return Error on missing first name" in new WithApplication {
[error]                                          ^
[error] one error found
[error] (test:compileIncremental) Compilation failed
[error] Total time: 3 s, completed 18/01/2016 9:30:42 PM

У меня есть аналогичные тесты в других приложениях, но похоже, что новая версия спецификаций добавляет большую поддержку Futures и других вещей, которые делают недействительными предыдущие руководства. Я использую Scala 2.11.6, Activator 1.3.6, и мой build.sbt выглядит следующим образом:

name := """eSalesTracker"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.6"

libraryDependencies ++= Seq(
  jdbc,
  cache,
  ws,
  "com.typesafe.slick" %% "slick"      % "3.1.0",
  "org.postgresql" % "postgresql" % "9.4-1206-jdbc42",
  "org.slf4j" % "slf4j-api" % "1.7.13",
  "ch.qos.logback" % "logback-classic" % "1.1.3",
  "ch.qos.logback" % "logback-core" % "1.1.3",
  evolutions,
  specs2 % Test,
  "org.specs2" %% "specs2-matcher-extra" % "3.7" % Test
)

resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"
resolvers += Resolver.url("Typesafe Ivy releases", url("https://repo.typesafe.com/typesafe/ivy-releases"))(Resolver.ivyStylePatterns)

// Play provides two styles of routers, one expects its actions to be injected, the
// other, legacy style, accesses its actions statically.
routesGenerator := InjectedRoutesGenerator

person djsumdog    schedule 19.01.2016    source источник


Ответы (2)


Я думаю, вы используете неправильный импорт WithApplication. Используйте это:

import play.api.test.WithApplication
person Tomer    schedule 19.01.2016
comment
Я только что показал своим коллегам, что у меня хороший google-foo, спасибо вам! - person mulya; 26.07.2016

Последняя строка тестового примера должна быть утверждением / оценкой.

например перед последним } метода тестового примера с ошибкой поместите оператор false must beEqualTo(true) и запустите его снова.

person Nkokhelox    schedule 05.05.2017