2014-09-30 2 views
4

Я следую документам here, и это, похоже, не работает; но я даже не уверен, что я делаю неправильно здесь.Изменения в 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 (ну, все два абзаца) ... и попробовал много вариантов, все безрезультатно.

full project's code is on github.

Стоит отметить, что если я уступлю «сильной плохой документации», и я использую Specs2, тогда тесты будут работать правильно (по крайней мере изнутри Intellij и, насколько это касается примера «hello world») ,

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

+1

Может ли ваша IntelliJ IDEA быть не в синхронизации с файлом build.sbt? Если вы не выбрали флажок «автоматический импорт» при импорте проекта в IntelliJ, вам необходимо вручную импортировать его. Первый эксперимент, который я попросил бы попытаться выяснить, - просто попробовать и запустить тесты вручную вне IntelliJ. Если они там отлично работают, я бы повторно импортировал проект в IntelliJ. –

+0

@BillVenners, что определенно не так, изменения в build.sbt отражаются сразу же в запуске. В любом случае даже запуск от активатора приводит к сбою тестов с последним исключением. – Marco

+0

OK. Мы попробуем это из вашего проекта. Трассировка стека, которую вы получаете, не исходит от ScalaTest, поэтому что-то еще не так. –

ответ

5

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

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

Страница обновлена ​​Versions, Versions, Versions Билл, и исправить было использование 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 
) 

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

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

+0

Имели те же проблемы с текущими версиями: 'playframework 2.5.12',' scalatest 3.0.1', 'scalatestplus-play 1.5.1'. Изменение 'scalatestplus-play 2.0.0' исправляло проблему неустанно. Это спасло мой день! –

1

Появляется, что у вас есть некорректная версия библиотеки.

Я использую 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. 
+0

Это определенно верно - я просто понял, что если запустить это из активатора: 'test-only ActivationSpec', он все равно пытается запустить их через Specs2 (в то время как вместо этого он должен запускать ScalaTest). Но я не знаю, откуда происходит «несоответствие версии»! – Marco

+0

Не могли бы вы поделиться своим 'build.sbt' и содержимым вашего проекта/подкаталога? – Marco