![](/img/trans.png)
[英]How to define custom configuration to filter ScalaTest tests in build.sbt?
[英]Changes to build.sbt to enable ScalaTest tests to run with Scala Play
我在这里关注文档,这似乎根本不起作用; 但我甚至不确定我在这里做错了什么。
首先,只需在project/Build.scala
文件中添加给定的片段就会导致编译错误; 所以这不是一个开始。 将其包装在扩展Build
的对象内(如SBT示例中所示)不会导致编译错误,但不会运行测试。
最后,我在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文档(好吧,它的整个两段......)并尝试了很多变化,都无济于事。
值得注意的是,如果我屈服于“糟糕的文档”并且我使用Specs2,那么测试运行正确(至少从Intellij内部,并且就'hello world'示例而言)。
我仍然更喜欢使用ScalaTest(真的不明白为什么我需要学习两个测试框架,真的) - 所以,任何帮助将不胜感激。
最后,事实证明它确实是一个库版本不匹配,但我没有预料到。
它围绕这样一个事实,即我的sbt构建中有一个子项目,它运行得很好,但是导入了ScalaTest 2.2.1,而我使用2.1.7使其与ScalaTest + 1.1.0一起使用 - 但是,使用ScalaTest 2.1.7(确实适用于ST + 1.1.0)仅适用于“顶级”项目,导致抽象类等周围的怪异。
版本,版本,版本页面现已由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获得帮助和指导的主要信用。
看来你的库版本不匹配。
我一直在使用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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.