Изменения в build.sbt, позволяющие запускать тесты ScalaTest с Scala Play

Я следую за документами здесь, и это, кажется, не работает вообще; но я даже не уверен, что я здесь делаю неправильно.

Для начала, просто добавив данный фрагмент в project/Build.scala файл вызывает ошибку компиляции; так что это не начало. Оборачивая его внутри объекта, который расширяется Build (как в примере SBT) не вызывает ошибку компиляции, но тесты не запускаются.

В конце концов, я добавил следующее build.sbt

libraryDependencies ++= Seq(
    "org.scalatestplus" %% "play" % "1.0.0" % "test",
    ...

это немного лучше, но в IntelliJ мой ApplicationSpec имеет все виды ошибок компиляции:

import org.scalatestplus.play._

import scala.collection.mutable.Stack

class ApplicationSpec extends PlaySpec {

  "A Stack" must {
    "pop values in last-in-first-out order" in {
      val stack = new Stack[Int]
      stack.push(1)
      stack.push(2)
      stack.pop() mustBe 2
      stack.pop() mustBe 1
    }
    "throw NoSuchElementException if an empty stack is popped" in {
      val emptyStack = new Stack[Int]
      a [NoSuchElementException] must be thrownBy {
        emptyStack.pop()
      }
    }
  }
}

must, mustBe а также a не признаются Наконец, если я попытаюсь бежать activator test Я получил:

sentinel/test:definedTests
java.lang.NoSuchMethodError: org.specs2.runner.Fingerprints$.fp1()Lorg/specs2/runner/SpecificationFingerprint;
    at org.specs2.runner.Specs2Framework.fingerprints(SbtRunner.scala:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sbt.TestFramework$.getFingerprints(TestFramework.scala:113)
    at sbt.Tests$$anonfun$discover$1.apply(Tests.scala:242)
    at sbt.Tests$$anonfun$discover$1.apply(Tests.scala:242)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
    at sbt.Tests$.discover(Tests.scala:242)
    at sbt.Defaults$$anonfun$detectTests$1.apply(Defaults.scala:556)
    ...
[error] (sentinel/test:definedTests) java.lang.reflect.InvocationTargetException

По сути, эпический провал - было бы замечательно, если бы документы были немного более конкретными в отношении того, что требуется и что ожидается для работы всего механизма: при сложившихся обстоятельствах довольно сложно распутать беспорядок.

Я часами гуглил и смотрел здесь на переполнение стека, смотрел документы ScalaTestPlus (ну, все два абзаца...) и пробовал много вариантов, но все безрезультатно.

Полный код проекта на github.

Стоит отметить, что если я поддамся "силе плохой документации" и использую Specs2, то тесты будут выполняться корректно (по крайней мере, из Intellij, а также из примера "Привет, мир").

Я все еще предпочел бы использовать ScalaTest (на самом деле не могу понять, зачем мне нужно изучать ДВА фреймворка для тестирования), поэтому любая помощь будет принята с благодарностью.

2 ответа

Решение

В конце концов оказалось, что это действительно было несовпадение версий библиотеки, но я не ожидал этого.

Это связано с тем фактом, что у меня есть подпроект в моей сборке sbt, который прекрасно работает, но импортировал ScalaTest 2.2.1, в то время как я использовал 2.1.7, чтобы заставить его работать с ScalaTest+ 1.1.0 - однако, используя ScalaTest 2.1.7 (который действительно работает с ST+ 1.1.0) только для проекта "верхнего уровня" вызывал странности вокруг абстрактного класса и т. Д.

Страница Версии, Версии, Версии была обновлена ​​Биллом, и исправлением было использование ScalaTest 2.2.1, ScalaTestPlus 1.2.0 и Play 2.3.0 - которые все хорошо играют вместе.

Обновлено - выше все еще вызывало сбой тестов через sbt/activator testЯ мог только запустить тесты через IntelliJ: исправление было в том, чтобы обновить build.sbt для использования Scala 2.11

В конце концов, чтобы сделать эту работу, это то, что у меня есть в моем build.sbt:

name := "sentinel"

version := "0.2-SNAPSHOT"

organization := "AlertAvert.com"

scalacOptions ++= Seq("-deprecation", "-feature", "-language:postfixOps")

// The REST project depends on Core Sentinel classes
lazy val sentinel_core = project

lazy val sentinel = (project in file("."))
    .enablePlugins(PlayScala)
    .aggregate(sentinel_core)
    .dependsOn(sentinel_core)

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "2.2.1" % "test",
  "org.scalatestplus" %% "play" % "1.2.0" % "test",
  cache
)

(Я воспроизвожу его полностью, так что если у кого-то еще возникнет такая же проблема, он увидит ее - меня бесит, когда люди только вставляют фрагмент, а некоторые ключевые элементы опускаются:)

Основные кредиты Биллу Веннерсу за помощь и руководство.

Похоже, у вас где-то не совпадает версия библиотеки.

Я использую Scalatest с Play и у меня не было проблем.

Я использую Play 2.3.4, ScalaTest 2.2.1.

 activator "test-only com.abc.tests.controllers.ApplicationSpec"

[info] ApplicationSpec:
[info] A Stack
[info] - must pop values in last-in-first-out order
[info] - must throw NoSuchElementException if an empty stack is popped
[info] ScalaTest
[info] Run completed in 1 second, 119 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
Другие вопросы по тегам