更改build.sbt以使ScalaTest测试能够与Scala Play一起运行

Mar*_*rco 4 scala scalatest playframework intellij-13

我在这里关注文档,这似乎根本不起作用; 但我甚至不确定我在这里做错了什么.

首先,只是在project/Build.scala文件中添加给定的片段会导致编译错误; 所以这不是一个开始.将其包装在扩展的对象内Build(如在SBT示例中)不会导致编译错误,但不会运行测试.

最后,我已将以下内容添加到我的 build.sbt

libraryDependencies ++= Seq(
    "org.scalatestplus" %% "play" % "1.0.0" % "test",
    ...
Run Code Online (Sandbox Code Playgroud)

这稍微好一点,但在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()
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

从本质上讲,一个史诗般的失败 - 如果文档在需要什么以及对所有机器的工作有什么期望时更加具体,那将是很好的:事实上,解决这些混乱有点困难.

我今天一直在谷歌上搜索堆栈溢出几个小时,查看ScalaTestPlus文档(好吧,它的整个两段......)并尝试了很多变化,都无济于事.

整个项目的代码在GitHub上.

值得注意的是,如果我屈服于"糟糕的文档"并且我使用Specs2,那么测试运行正确(至少从Intellij内部,并且就'hello world'示例而言).

我仍然更喜欢使用ScalaTest(真的不明白为什么我需要学习两个测试框架,真的) - 所以,任何帮助将不胜感激.

Mar*_*rco 5

最后,事实证明它确实是一个库版本不匹配,但我没有预料到.

它围绕这样一个事实,即我的sbt构建中有一个子项目,它运行得很好,但是导入了ScalaTest 2.2.1,而我使用2.1.7使其与ScalaTest + 1.1.0一起使用 - 但是,使用ScalaTest 2.1.7(确实适用于ST + 1.1.0)仅针对"顶级"项目导致了抽象类等的奇怪现象.

版本,版本,版本页面现在已经被比尔更新,并修复已经使用ScalaTest 2.2.1,1.2.0 ScalaTestPlus和播放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
)
Run Code Online (Sandbox Code Playgroud)

(我正在完整地复制它,所以如果其他人有同样的问题,他们会看到它 - 当人们只粘贴一个片段而一些关键要素被省略时,它激怒了我:)

Bill Venners获得帮助和指导的主要信用.