【问题标题】:Changes to build.sbt to enable ScalaTest tests to run with Scala Play更改 build.sbt 以使 ScalaTest 测试能够与 Scala Play 一起运行
【发布时间】:2014-11-24 15:07:11
【问题描述】:

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

首先,在project/Build.scala 文件中添加给定的sn-p 会导致编译错误;所以这不是一个开始。 将其包装在扩展 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()
      }
    }
  }
}

mustmustBea 无法识别。 最后,如果我尝试运行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(真的不明白为什么我需要学习两个测试框架,真的) - 所以,任何帮助都将不胜感激。

【问题讨论】:

  • 您的 IntelliJ IDEA 会不会与 build.sbt 文件不同步?如果在将项目导入 IntelliJ 时没有选中“自动导入”复选框,则需要手动导入。我要求您尝试找出的第一个实验是尝试在 IntelliJ 之外手动运行测试。如果它们在那里运行良好,那么我会将项目重新导入 IntelliJ。
  • @BillVenners 绝对不是这样,build.sbt 中的更改会立即反映在运行中。无论如何,即使从激活器运行也会导致测试失败,并出现后一个异常。
  • 好的。我们将从您的项目中进行尝试。您获得的堆栈跟踪不是来自 ScalaTest,所以还有其他问题。
  • 谢谢@BillVenners - 分支在这里:github.com/massenz/sentinel/tree/79330610_API_unit_tests 随意拉扯和弄乱它。我在用户组中发现了一个线程,其中提到了这一点:testOptions in Test := Nil 要添加到某个地方(我猜是在 Build.scala 中?)你知道吗?主题:groups.google.com/forum/#!topic/play-framework/rZBfNoGtC0M
  • 有趣的问题 - 完整阅读。但是,您是否考虑重命名标题,因为它有点让人对在 Play 中使用 ScalaTest 产生一种模糊的想法。也许不是完全应得的(虽然有点)? :)

标签: scala playframework scalatest intellij-13


【解决方案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.

【讨论】:

  • 这绝对是真的 - 我刚刚意识到如果从激活器运行它:test-only ActivationSpec 它仍然会尝试通过 Specs2 运行它们(而它应该运行 ScalaTest)。但我不知道“版本不匹配”从何而来!
  • 能否分享您的build.sbt 以及您的项目/子目录的内容?
【解决方案2】:

最后发现确实是库版本不匹配,但我没有预料到。

它围绕着这样一个事实,即我在我的 sbt 构建中有一个子项目,它工作得很好,但正在导入 ScalaTest 2.2.1,而我使用 2.1.7 使其与 ScalaTest+ 1.1.0 一起工作 -但是,仅将 ScalaTest 2.1.7(确实适用于 ST+ 1.1.0)用于“顶级”项目会导致抽象类周围的怪异,等等。

Versions, Versions, Versions 页面现已由 Bill 更新,修复方法是使用 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
)

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

主要感谢 Bill Venners 提供的帮助和指导。

【讨论】:

  • 与当前版本有同样的问题:playframework 2.5.12scalatest 3.0.1scalatestplus-play 1.5.1scalatestplus-play 2.0.0 的更改立即解决了该问题。这拯救了我的一天!
猜你喜欢
  • 2016-01-18
  • 2017-09-17
  • 2013-03-23
  • 1970-01-01
  • 2014-05-24
  • 2015-07-20
  • 2018-04-11
  • 1970-01-01
  • 2018-01-30
相关资源
最近更新 更多